我想使用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
当然这不起作用,因为在这种情况下, START
和END
仅仅是__LINE__
宏的重新定义。
我正在使用#
和##
运算符,但是在预处理器运行时我无法让预处理器评估START
和END
。
我的问题是:这有可能吗?
不能选择在运行时检查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)
是一个编译时表达式,给出行偏移量。
放入宏并重命名START
和END
以品尝。
如果你这样声明数组:
static const char* string_list[42] = {...
编译器会告诉您是否提供了太多初始化程序。 如有必要,您可以提供标记结尾的标记条目:
static char* string_list[43] = { ..., NULL } ;
如果你需要知道,也许编写一个函数来确定运行时的长度。
以上就是c/c++开发分享计算C预处理器中两个代码位置之间的行数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545822.html