在同一命令中分配两个C预处理器marcos

问题描述 投票:2回答:3

是否可以同时将相同的值分配给两个C预处理器宏?它的行为类似于正常的C代码:

a = b = 1;

我知道您可以这样做:

#define VAR1 1
#define VAR2 1

但是,这有点痛苦,因为现在有了代码复制并且有更多的机会搞砸事情。是唯一的解决方案吗?

#define VAR1 1
#define VAR2 VAR1

EDIT:正如各种注释所指出的那样,预处理器具有宏,而不是变量。抱歉。

c c-preprocessor
3个回答
3
投票

ISO C标准没有描述任何预处理指令,该指令将相同的替换序列分配给多个符号。即这种事情在标准中不存在:

// fantasy syntax:
#definemulti (A B C) replacement token sequence

由于替换序列可以包含多个标记,因此必须在某处添加括号,或者使用其他方法来告知名称结尾和替换序列。

在28年的C编码中,我从未在任何地方看到任何需要使用具有此类扩展名的编译器的代码片段。即使您找到具有此扩展名的编译器,使用它的不可移植性也几乎不值得。

将其引入语言中可能会遇到障碍,因为它只保存少量的键入内容。

而且,我们可以用technical来论证这是不适当的功能。

假设我们有几个编译时参数-ABC-用于调整代码的行为。它们恰好具有相同的值,因此我们在一行中对其进行定义。

[如果以后它们不再具有相同的值,则必须编辑该程序以将不同的值拆分为单独的#define构造。例如从此:

#definemulti (A B C) 1

对此

#definemulti (A C) 1
#define B 2

这导致线差异触摸AC。整个definemulti行都替换为新的行,因为B从其中移出了。在GNU风格的上下文差异下,更改可能类似于以下内容:

@@ -x, y  +z, w @@
 ...
-#define (A B C) 1
+#define (A C) 1
+#define B 2
 ...

首先,我们有:

#define A 1
#define B 1
#define C 1

diff大块更好,像这样:

@@ -x, y  +z, w @@
 ...
 #define A 1
-#define B 1
+#define B 2
 #define C 1
 ...

乍看之下,我们发现AC不受影响,并且B更改为2

我们还应考虑为什么我们要使用lval0 = lval1 = lval2 = ... = val形式的赋值表达式。一个重要原因是val仅被评估一次。由于评估顺序的更改和a = b = c的多重评估,表达式a = c, b = c不能总是重写为c


0
投票

preprocessor syntax,似乎没有一种将两个宏设置在一起的标准方法。该语法仅允许将一个令牌更改为一个或多个替换令牌,并且不允许像操作符链这样的操作。

也不可能将两个指令放在同一行中,因为预处理器指令必须以换行符结尾。在预处理程序运行之前,也没有digraphs or trigraphs可以插入换行符(已由许多先前的SO回答确认)。


0
投票

如果我可以推断的话,看起来您想要两个构建配置宏,但通常它们应该具有相同的值。

一种解决方案是对您的最后一个代码进行详细说明,

#define VAR1 1         /* May be from a configuration file or makefile. */

/* In the proper source: */
#ifndef VAR2           /* If some configuration is still missing, */
#   define VAR2 VAR1   /* fill in the blank. */
#endif

现在,如果您决定将VAR2定义为配置,它将取消ifndef中的默认设置。

© www.soinside.com 2019 - 2024. All rights reserved.