• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

c语言用什么进行宏定义

c语言用命令 #define进行宏定义。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。

一、c语言宏定义

在 C 语言中,可以采用命令 #define 来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。

#define         ARRAY_SIZE 100

double   data[ARRAY_SIZE];

这两行代码为值 100 定义了一个宏名称 ARRAY_SIZE,并且在数组 data 的定义中使用了该宏。惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量。上述简单的示例也展示了宏是怎样让 C 程序更有弹性的。
通常情况下,程序中往往多次用到数组(例如上述 data)的长度,例如,采用数组元素来控制 for 循环遍历次数。当每次用到数组长度时,用宏名称而不要直接用数字,如果程序的维护者需要修改数组长度,只需要修改宏的定义即可,即 #define 命令,而不需要修改程序中每次用到每个数组长度的地方。

在翻译的第三个步骤中,预处理器会分析源文件,把它们转换为预处理器记号和空白符。如果遇到的记号是宏名称,预处理器就会展开(expand)该宏;也就是说,会用定义的文本来取代宏名称。出现在字符串字面量中的宏名称不会被展开,因为整个字符串字面量算作一个预处理器记号。
无法通过宏展开的方式创建预处理器命令。即使宏的展开结果会生成形式上有效的命令,但预处理器不会执行它。
在宏定义时,可以有参数,也可以没有参数。

延伸阅读:

二、带参数的宏

你可以定义具有形式参数(简称“形参”)的宏。当预处理器展开这类宏时,它先使用调用宏时指定的实际参数(简称“实参”)取代替换文本中对应的形参。带有形参的宏通常也称为类函数宏(function-like macro)。

可以使用下面两种方式定义带有参数的宏:

#define 宏名称( [形参列表] ) 替换文本

#define 宏名称( [形参列表 ,] … ) 替换文本

“形参列表”是用逗号隔开的多个标识符,它们都作为宏的形参。当使用这类宏时,实参列表中的实参数量必须与宏定义中的形参数量一样多(然而,C99 允许使用“空实参”,下面会进一步解释)。这里的省略号意味着一个或更多的额外形参。

当定义一个宏时,必须确保宏名称与左括号之间没有空白符。如果在名称后面有任何空白,那么命令就会把宏作为没有参数的宏,且从左括号开始采用替换文本。

常见的两个函数 getchar()和 putchar(),它们的宏定义在标准库头文件 stdio.h 中。它们的展开值会随着实现版本不同而有所不同,但不论何种版本,它们的定义总是类似于以下形式:

#define getchar() getc(stdin)

#define putchar(x) putc(x, stdout)

当“调用”一个类函数宏时,预处理器会用调用时的实参取代替换文本中的形参。C99 允许在调用宏的时候,宏的实参列表可以为空。在这种情况下,对应的替换文本中的形参不会被取代;也就是说,替换文本会删除该形参。然而,并非所有的编译器都支持这种“空实参”的做法。

以上就是关于c语言宏定义的内容希望对大家有帮助。

相关文章