鱼C论坛

 找回密码
 立即注册
查看: 1977|回复: 4

[已解决]大佬求助(宏定义)

[复制链接]
发表于 2023-3-28 11:22:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想问问关于宏定义的问题。首先小甲鱼书上写道“符号常量的定义格式是:#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;
}
这里的宏定义中标识符为什么可以有()?如果上一个我可以理解,这个我就真的不理解了。希望大佬可以帮我解答。万分感谢
最佳答案
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


这里的括号是为了将宏定义的参数与宏定义的表达式分开。在这个例子中,宏定义的括号并不违反标识符的命名规则,因为它们是用来表示带有参数的宏定义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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


这里的括号是为了将宏定义的参数与宏定义的表达式分开。在这个例子中,宏定义的括号并不违反标识符的命名规则,因为它们是用来表示带有参数的宏定义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-29 08:17:49 | 显示全部楼层
宏定义就是没脑子的替换,不管你写的是什么,只要是文中出现的统统替换,这叫预处理,#define 就是预处理之一

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

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

这个()可以参照楼上,我就是个补充说明的作用,最佳答案给谁您随便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表