在C/C++ 语言中,#define是用来定义预处理宏的指令。 宏定义的目的是为了在代码中替换一些常量或表达式。 #define HOUR 365*24 表达式result = h / (HOUR)将展开为result = h / (365*24)。由于括号的存在,先计算(365*24),再执行整数除法。 表达式result = h / HOUR将展开为result = h /365*24。 在...
C语⾔宏定义时#(井号)和##(双井号)的⽤法 C语⾔中如何使⽤宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(⽽⾮运⾏期概念)。下⾯对常遇到的宏的使⽤问题做了简单总结。关于#和## 在C语⾔的宏中,#的功能是将其后⾯的宏参数进⾏字符串化操作(String...
但是在书写上注意两点MAX和左“(”之间没有空格,因为宏定义把标示符后的第一个空格会认为是标示符与字符串的分割。当然我们在写宏的时候有时候会写多行,这样我们一般用“\”进行分割。 2.加括号 我们说到宏只是简单的替换,即使是函数宏也是这样的,所以为了避免一些优先级的错误不要忘记加括号。 3.宏的副作用 ...
由此可见,对于带参宏定义不仅要在参数两侧加括号,还应该在整个字符串外加括号。
我们期望的答案应该是6才对,其实呢,运行之后的答案1。与宏定义相挂钩的就是优先级,算数运算符的优先级高于条件运算符,展开如下。 3+1>3?1:3,首先进行算符运算符的运算,即4>3?1:3,所以答案为1。 请注意宏定义中的括号,这些括号的作用就是预防引起优先级相关的问题。有些专家建议在C语言中只要牢记两个优先...
虽然预处理阶段的宏定义没问题,但在编译阶段是会产生错误的。因为宏定义只是文本替换,所以预处理的时候,会将所有的 N 替换成 5;,放到源代码中 arr[5;] 这种写法不符合 C 语言语法,所以就会产生报错。 无参宏定义还可以替换表达式,但需要注意的是,表达式需要加上括号,否则就会出现逻辑上的错误。例如:3....
宏定义基本语法 每个#define行(即逻辑行)由三部分组成:第一部分是指令 #define 自身,“#”表示这是一条预处理命令,“define”为宏命令。第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。第三部分“替换文本”可以是任意常数、表达式、字符串等。在预处理工作过程中...
如果是负数,需要将整个负数加括号如果是表达式,需要整个表达式要加括号 下面的代码都是limits.h头文件中的相关的宏定义 /* Minimum and maximum values a `signed short int' can hold. */ # define SHRT_MIN (-32768) # define SHRT_MAX 32767 可以看到负数要加括号,正数不需要加括号 我暂时没有想到怎么...
在C++中,宏定义(包括带括号的宏)被展开为预处理器指令,这些指令在编译过程的预处理阶段执行。预处理器指令用于处理源代码中的宏、条件编译和头文件包含等。 在C++中,宏定义可以用于简化代码、提高代码的可读性和可维护性,以及用于实现代码的复用。宏定义还可以用于实现代码的格式化和排版,例如将代码中的函数调用和操...