使用下一个代码语句的 C 宏或 GCC 指令
C macro or GCC directive to consume next code statement
是否有 C 宏、GCC 指令或 pragma 来使用宏之后的下一个代码语句,而不显式地将其作为参数传递给宏?
像这样:
#define CONSUME_NEXT_IF(a) if (a) { (<next>) } else;
我会将其用作:
CONSUME_NEXT_IF(a) stmt1;
并期望它扩展到:
if (a) stmt1;
else;
我在这里使用 if
语句作为示例。条件语句不是重点,而是宏使用 stmt1
而不实际将其作为参数传递的能力。
#define CONSUME_NEXT_IF(a) if (!(a)) {} else
如果 a
是 true
(或非零), 将达到只执行 "next statement" 的效果(在使用宏和下一个 ;
之间) .如果您对 a
的表达式类型有适当的限制,则可以删除 (a)
上的 ()
。
就个人而言,尽管您在评论中解释说您想要与注释类似的效果,但我认为这会引入更多的维护问题 - 包括代码混淆 - 而不是减轻。特别是如果它与 a
或 stmt1
.
中使用的其他宏交互
当然,需要修改您的 "large code base" 才能使用宏。
这也会在您的可执行文件中留下死代码 - 它不会阻止将 stmt1
的代码发送到可执行文件(除非 a
具有固定的编译时值,并且您的编译器已在这种情况下检测和优化代码的能力)。因此,这样的构造将意味着您无法满足多个需要防止死代码的保证标准的要求。
是否有 C 宏、GCC 指令或 pragma 来使用宏之后的下一个代码语句,而不显式地将其作为参数传递给宏?
像这样:
#define CONSUME_NEXT_IF(a) if (a) { (<next>) } else;
我会将其用作:
CONSUME_NEXT_IF(a) stmt1;
并期望它扩展到:
if (a) stmt1;
else;
我在这里使用 if
语句作为示例。条件语句不是重点,而是宏使用 stmt1
而不实际将其作为参数传递的能力。
#define CONSUME_NEXT_IF(a) if (!(a)) {} else
如果 a
是 true
(或非零), 将达到只执行 "next statement" 的效果(在使用宏和下一个 ;
之间) .如果您对 a
的表达式类型有适当的限制,则可以删除 (a)
上的 ()
。
就个人而言,尽管您在评论中解释说您想要与注释类似的效果,但我认为这会引入更多的维护问题 - 包括代码混淆 - 而不是减轻。特别是如果它与 a
或 stmt1
.
当然,需要修改您的 "large code base" 才能使用宏。
这也会在您的可执行文件中留下死代码 - 它不会阻止将 stmt1
的代码发送到可执行文件(除非 a
具有固定的编译时值,并且您的编译器已在这种情况下检测和优化代码的能力)。因此,这样的构造将意味着您无法满足多个需要防止死代码的保证标准的要求。