计算C预处理器中两个代码位置之间的行数

我想使用C预处理器来计算两个代码位置之间的行数。 基本想法是这样的:

#define START __LINE__ static char* string_list[] = { "some string", "another string", ... "last string" }; #define END __LINE__ #if END - START > 42 #error Too many entries #endif 

当然这不起作用,因为在这种情况下, STARTEND仅仅是__LINE__宏的重新定义。
我正在使用###运算符,但是在预处理器运行时我无法让预处理器评估STARTEND

我的问题是:这有可能吗?

不能选择在运行时检查arrays的大小。
预先感谢任何提示或想法!

您不应该为此目的使用这些宏:如果您在某处引入额外的行,代码将变得完全无法维护。 如果线路太少会怎么样?

而不是宏,使用静态断言:

 static_assert(sizeof(string_list) / sizeof(*string_list) == SOME_CONSTANT, "Wrong number of entries in string list."); 

如果您没有使用支持static_assert的C11,您可以自己编写这样的断言,例如:

 #define COMPILE_TIME_ASSERT(expr) {typedef uint8_t COMP_TIME_ASSERT[(expr) ? 1 : 0];} 

[Acknowledge @Lundin指出你可以使用typedef ]

这是一种方式

 typedef uint8_t START[__LINE__]; /*put this on one line*/ typedef uint8_t END[__LINE__]; /*put this on another line*/ 

sizeof(END) - sizeof(START)是一个编译时表达式,给出行偏移量。

放入宏并重命名STARTEND以品尝。

如果你这样声明数组:

 static const char* string_list[42] = {... 

编译器会告诉您是否提供了太多初始化程序。 如有必要,您可以提供标记结尾的标记条目:

 static char* string_list[43] = { ..., NULL } ; 

如果你需要知道,也许编写一个函数来确定运行时的长度。