如何将C中的多行宏与行尾的注释结合起来

时间:2015-09-24 22:11:20

标签: c comments preprocessor

我有脑痉挛...在C中是否有办法将多行宏与每行注释结合起来?

e.g。

#define MYARRAY { \
  0.001,   //  5 mV \
  0.002,   // 10 mV \
  0.004,   // 20 mV \
  0.007,   // 35 mV \
  0.013    // 65 mV \
}

我需要在头文件中定义一个注释数组值列表,这些值在其他地方使用,并使其具有人类可读性。

4 个答案:

答案 0 :(得分:7)

您可以使用多行注释作为将宏定义从一行继续到另一行而不是反斜杠的方法。如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
*/ }

请注意,在注释被识别之前,第2阶段会删除行连续符(反斜杠换行符)。因此,使用C ++样式//注释的问题不在于注释包含反斜杠;而是首先将这些行连接起来,然后注释延伸到连接行的末尾。

答案 1 :(得分:4)

你应该可以这样做,但不能用C ++风格//评论。尝试使用传统的/ * * / C注释。 C ++注释会注释掉该行的其余部分,包括反斜杠。

答案 2 :(得分:4)

根据评论,这似乎是一个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
};

如果仅在单个文件中使用,请将其设为static,如图所示,否则删除static并添加

extern const float cal_table[5];

到模块的头文件。

注意,如果这是针对没有浮点单元的小型MCU(AVR / PIC),最好不使用float,而是使用整数模拟定点(例如缩放到1mV)

您也可以将其用作auto数组变量的初始值设定项。将该数组设为typedef,根据需要生成const,并根据需要将memcpy数组添加到局部变量。这与初始化程序一样快,因为编译器还必须将其复制到本地数组。因此,您使用const数组作为模板(如果需要,仍然只需要更改一个位置)。

答案 3 :(得分:2)

不是你想要的。没有评论,但仍然是人类可读的,它会为你计算值:

#define MILLI_VOLT(v) (v/5000.0)

#define MYARRAY {   \
    MILLI_VOLT(5),  \
    MILLI_VOLT(10), \
    MILLI_VOLT(20), \
    MILLI_VOLT(35), \
    MILLI_VOLT(65), \
}

double a[] = MYARRAY;