如何将 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
数组作为模板(如果需要,仍然有一个位置可以更改)。
我脑抽筋了...有没有办法在 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
数组作为模板(如果需要,仍然有一个位置可以更改)。