自定义条件预处理指令。

3

在C语言中,是否可以编写自定义条件预处理器指令? 例如:

#define _IF_ (condition, explanation) \
       #ifdef condition

非常感谢您的评论。


1
简而言之:不行。这是一个XY问题。请解释一下你想要实现什么。https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem - Yunnosch
将会有不同的函数名称,并且使用 #ifdef 指令进行区分。还将有一个 PC 程序,它将读取代码并将相同的函数名称提取到 UI 界面中。在这一点上,解释非常重要,PC 将在 UI 上使用此解释。通过这个解释,用户可以选择正确的函数。这就是为什么我想编写一个带有解释的预处理指令的原因。 - Ozgur
请编辑以添加信息,并利用其提供的空间提供示例和一些概念代码,说明您想如何使用它以及上下文是什么样子。 - Yunnosch
1个回答

1

简单回答

不行。

#define预处理指令无法发出另一个预处理指令(如#ifdef),因为#ifdef不在行的开头。

预处理指令是程序中以#开头的行。 #后面是指令名称的标识符。例如,#define是定义宏的指令。在#前后也允许有空格。

我能想到的最优雅的语法是这样的。

#define _IF_(condition,explanation) condition

#if _IF_(1 == 2,"A False Case")
   "This should not appear"
#endif

#if _IF_(1 == 1,"A True Case")
   "This should appear"
#endif

演示在这里: https://godbolt.org/z/JFljOm 尽管这个宏可能有更好的标签。

糟糕的答案

如果您真的需要出于某种原因获得这个语法,并且愿意稍微修改您的构建系统。

您可以通过预处理器两次运行代码以允许此双重扩展。 然而,预处理器宏也无法发出#字符,因此我们将使用??=三连符来规避这个问题。

// File a.prec

#define _IF_(condition, explanation) \
       ??=if condition
#define _ELSE_ ??=else
#define _ENDIF_ ??=endif

_IF_(1==1,"Yep")
"This Text"
_ENDIF_

_IF_(2==1,"Nope")
"Not This Text"
_ENDIF_

使用仅带有-E标志的编译,可以给我们提供以下结果。https://godbolt.org/z/sJIScN
??=if 1==1
"This Text"
??=endif

??=if 2==1
"Not This Text"
??=endif

我们需要在主编译步骤中启用-trigraphs,以将??=解析为#。这样可以得到所需的输出: https://godbolt.org/z/-0rqe5
"This Text"

这个解决方案会给你带来正常包含方面的问题,因为使用预处理器两次是不安全的,所以你需要在任何你只想发生在正常编译步骤中的内容上使用??=三字符序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接