Jas*_*n S 7 c preprocessor comments
我有脑痉挛... C中是否有一种方法可以将多线宏与每条线上的注释结合起来?
例如
#define MYARRAY { \
0.001, // 5 mV \
0.002, // 10 mV \
0.004, // 20 mV \
0.007, // 35 mV \
0.013 // 65 mV \
}
Run Code Online (Sandbox Code Playgroud)
我需要在头文件中定义一个注释数组值列表,这些值在其他地方使用,并使其非常易读.
您可以使用多行注释作为将宏定义从一行继续到另一行而不是反斜杠的方法.如C标准§5.1.1.2/ 1中所述,在转换阶段3期间,注释被简化为单个空格,而预处理指令在阶段4中执行.实际上,这意味着多行注释中的换行符不会终止一个预处理指令,所以你可以写:
#define MYARRAY { /*
*/ 0.001, /* 5 mV
*/ 0.002, /* 10 mV
*/ 0.004, /* 20 mV
*/ 0.007, /* 35 mV
*/ 0.013 /* 65 mV
*/ }
Run Code Online (Sandbox Code Playgroud)
请注意,在第2阶段删除行继续(反斜杠换行符),然后才能识别注释.因此使用C++风格//注释的问题不在于注释包含反斜杠; 而是首先连接线,然后注释延伸到连接线的末尾.
根据评论,这似乎是一个 XY 问题。宏可能不是最好的方法。
如果您需要一个常量表,通常的方法是生成一个数组一次并在整个代码中使用它:
static const float cal_table [5] = {
0.001, // 5 mV
0.002, // 10 mV
0.004, // 20 mV
0.007, // 35 mV
0.013 // 65 mV
};
Run Code Online (Sandbox Code Playgroud)
如果仅在单个文件中使用,请使其static如图所示,否则删除static并添加
extern const float cal_table[5];
Run Code Online (Sandbox Code Playgroud)
到模块的头文件。
请注意,如果这是针对没有浮点单元的小型 MCU (AVR/PIC),则最好不要使用float,而是使用整数进行定点模拟(例如缩放至 1mV)。
您还可以将其用作数组变量的初始值设定项auto。将该数组设为 a typedef,const按所述生成 ,并memcpy根据需要将该数组生成为局部变量。这与初始化程序一样快,因为编译器还必须将其复制到本地数组。因此,您可以使用该const数组作为模板(如果需要,仍然可以更改单个位置)。