在同一命令中分配两个C预处理程序变量

时间:2016-11-06 14:57:53

标签: c c-preprocessor

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

a = b = 1;

我知道你可以这样做:

#define VAR1 1
#define VAR2 1

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

#define VAR1 1
#define VAR2 VAR1

编辑:正如各种评论所指出的,预处理器有宏,而不是变量。对不起。

3 个答案:

答案 0 :(得分:3)

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

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

由于替换序列可以包含多个令牌,因此必须要么必须在某处使用括号,或者使用某种其他方式来判断名称的结束位置和替换序列。

在28年的C编码中,我还没有看到任何需要编译器具有这种扩展的代码片段。即使你找到一个将其作为扩展的编译器,使用它的非便携性也是如此。几乎不值得。

将这种语言引入语言可能会遇到障碍,因为它只会节省少量的输入。

此外,我们可以提出一个技术论证这是一个错误。

假设我们有几个编译时参数 - 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
差异很好,像这样:

@@ -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

答案 1 :(得分:0)

查看preprocessor syntax,似乎没有一种标准方法可以将两个宏设置在一起。语法只允许将一个标记更改为一个或多个替换标记,并且不允许任何类似操作符链接。

也不可能将两个指令放在同一行中,因为预处理程序指令必须以换行符结尾。在预处理程序运行之前,也没有digraphs or trigraphs注入换行符(正如之前的一些SO答案所证实的那样)。

答案 2 :(得分: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中的默认设置。