onlyyyr 发表于 2023-3-28 11:22:43

大佬求助(宏定义)

我想问问关于宏定义的问题。首先小甲鱼书上写道“符号常量的定义格式是:#define 标识符 常量”。在小甲鱼的一道题目中代码是这样的:
#include <stdio.h>
#define INT int
#define BEGIN {
#define END }
#define PRINTF printf
#define SCANF scanf
#define ELSE else
#define IF if

INT main()
BEGIN
      INT i;

      PRINTF("请输入您的年龄:");
      SCANF("%d", &i);

      IF (i < 18)
                PRINTF("您未满18周岁,不得使用这个程序!\n");
      ELSE
                PRINTF("您已满18周岁,欢迎使用本程序,嘿嘿嘿...\n");

      return 0;
END
这里宏定义后面的标识符里面有关键字(代码是可运行的,我不知道这么弄成大佬们那样可以直接复制的那种,不好意思),可是小甲鱼说标识符的命名规律和变量名的是一样的,但是这里的标识符为什么可以是关键字呢。难道是因为大小写?然后之前的一道题目,小甲鱼的答案中是:
#include <stdio.h>

#define PI 3.14159
#define S(r) PI * r * r
#define C(R) 2 * PI * r

int main()
{
      int r = 5;

      printf("半径为%d的圆,面积是:%.2f,周长是:%.2f\n", r, S(r), C(r));

      return 0;
}
这里的宏定义中标识符为什么可以有()?如果上一个我可以理解,这个我就真的不理解了。希望大佬可以帮我解答。万分感谢

isdkz 发表于 2023-3-28 11:34:03

首先,我们来分析第一个问题。在这个例子中,宏定义实际上是将一些关键字映射到了其他宏标识符。这里使用宏定义是为了展示宏定义的功能,并不是一种推荐的编程实践。实际上,在实际的编程中,我们应该避免使用关键字作为宏定义的标识符。

在这个例子中,宏定义的目的是用一个新的名字来代替原来的关键字,因此宏定义的标识符可以包含关键字。但是,请注意,这并不意味着我们在实际编程中应该这样做,因为这样做会降低代码的可读性。

对于第二个问题,宏定义中的括号是用来组织宏定义表达式的。在这个例子中,S(r) 和 C(R) 定义了带有参数的宏。括号内的 r 是宏定义的参数,这意味着当我们使用这些宏时,可以传递一个参数给它们。例如,在 S(r) 和 C(r) 中,r 是一个参数。当我们调用 S(r) 和 C(r) 时,它们会被展开成相应的表达式,如下:

S(r) => PI * r * r
C(r) => 2 * PI * r


这里的括号是为了将宏定义的参数与宏定义的表达式分开。在这个例子中,宏定义的括号并不违反标识符的命名规则,因为它们是用来表示带有参数的宏定义。

myd0311 发表于 2023-3-29 08:17:49

宏定义就是没脑子的替换,不管你写的是什么,只要是文中出现的统统替换,这叫预处理,#define 就是预处理之一

在处理完之后,他就会正式去编译了

而且我补充一下,最接近 #define 的才是标识符,这个必须遵守命名规则,但后面的随便你怎么搞,带空格的都可以,例如:

#define Inta int a;
int main() {
    Inta
    a = 2;
}

这个()可以参照楼上,我就是个补充说明的作用,最佳答案给谁您随便

onlyyyr 发表于 2023-3-29 18:21:12

isdkz 发表于 2023-3-28 11:34
首先,我们来分析第一个问题。在这个例子中,宏定义实际上是将一些关键字映射到了其他宏标识符。这里使用宏 ...

感谢大佬{:10_297:}

onlyyyr 发表于 2023-3-29 18:21:42

myd0311 发表于 2023-3-29 08:17
宏定义就是没脑子的替换,不管你写的是什么,只要是文中出现的统统替换,这叫预处理,#define 就是预处理之 ...

感谢大佬{:10_297:}
页: [1]
查看完整版本: 大佬求助(宏定义)