c/c++开发分享计算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 } ; 

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

      以上就是c/c++开发分享计算C预处理器中两个代码位置之间的行数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545822.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注