C语言宏(macro)小技巧 目录 字符串化运算符(stringizing operator) 记号粘贴运算符(token-pasting operator) 二选一选择器宏(mux) 字符串化运算符(stringizing operator)# 运算符 # 在宏中会将实参直接转化为字符串literal,也就是字符串常量,举个简单的例子: #define arg2str(p) #p puts(arg2str(666));...
min((,),) → (((,)) < ( ) ? ((,)) : ( )) min() error→ macro "min" requires 2 arguments, but only 1 given min(,,) error→ macro "min" passed 3 arguments, but takes just 2 字符化/Stringizing 如果函数宏中入参在字符串中,是不会被展开的,它就是普通的字符串字面量,这样的...
每个#define行(即逻辑行)由三部分组成:第一部分是指令 #define 自身,“#”表示这是一条预处理命令,“define”为宏命令。第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。第三部分“替换文本”可以是任意常数、表达式、字符串等。在预处理工作过程中,代码中所有出现...
CC++中宏Macro的深入讲解 CC++中宏Macro的深⼊讲解 前⾔ 宏(Macro)本质上就是代码⽚段,通过别名来使⽤。在编译前的预处理中,宏会被替换为真实所指代的代码⽚段,即下图中Preprocessor 处理的部分。C/C++ 代码编译过程 - 图⽚来⾃ ntu.edu.sg 根据⽤法的不同,分两种,Object-like 和 ...
C/C++中宏/Macro的深入讲解 前言 宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中 Preprocessor 处理的部分。 C/C++ 代码编译过程 - 图片来自 ntu.edu.sg 根据用法的不同,分两种,Object-like 和 Function-like。前者用于 Object 对象,后者用于函数...
min(,,) error→ macro "min" passed 3 arguments, but takes just 2 字符化/Stringizing 如果函数宏中入参在字符串中,是不会被展开的,它就是普通的字符串字面量,这样的结果是符合预期的。 #define foo(x) x, "x" foo(bar) → bar, "x" ...
/* OK */int32_tfoo(void){return;}/* OK */staticconstchar*get_string(void){return"Hello world!\r\n";}/* Wrong */int32_tfoo(void){return;} 变量 使变量名全部小写,下划线_字符可选 /* OK */int32_t a;int32_t my_var;int32_t myvar;/* Wrong */int32_t A;int32_t myVar;...
在於 X macro 的定義,雖然看起來有點可怕,仔細推敲一下,會發現這裡定義的 EValue 和 table[] 與方法 2 所定義的完全一模一樣,只是中間的程式碼透過前處理器以 VALUE_TABLE 取代了,但確實改善了 “索引” 和 “值” 之間比對的問題,在 VALUE_TABLE 中可以很明確地看出每一個 enum 列舉值所對應的 string。
如果使用macro机制的话,可以通过预编译和macro机制一次性处理上述的问题。 例如:在文件msgdef.h中 1 #ifndef _MSGDEF_H_ 2 #define_MSGDEF_H_ 3 #undefUSEMACRO 4 #ifdefined(INCLUDE_AS_ENUM)//判断预编译宏的设置情况,判断是转换成enum还是string ...
#define STRING(x) #x const char * str = STRING(test); // str的内容就是"test" ##符号会连接两边的值,像一个粘合剂一样,将前后两部分粘合起来,从而产生一个新的值,例如 #define VAR(index) INT_##index int VAR(1); // 宏被展开后将成为 int INT_1; ...