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

how to combine multiline macros in C with comments at the end of a line

我脑抽筋了...有没有办法在 C 中将多行宏与每行的注释结合起来?

例如

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

我需要在其他地方使用的头文件中定义一个注释数组值列表,并使其易于阅读。

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

您可以使用多行注释作为从一行到另一行继续宏定义的方式,而不是反斜杠。如 C 标准 §5.1.1.2/1 中所述,注释在翻译阶段 3 中减少为单个 space,而预处理指令在阶段 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++ 风格 // 注释的问题不在于注释包含反斜杠;而是首先将行连接起来,然后注释延伸到连接行的末尾。

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

#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;

根据评论,这似乎是一个 XY 问题。宏可能不是最好的方法。

如果您最多 table 个常量,通常的方法是只生成一次数组并在整个代码中使用它:

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 数组作为模板(如果需要,仍然有一个位置可以更改)。