是否可以同时为两个C预处理器宏分配相同的值?它的行为类似于这个普通的C代码:
a = b = 1;
我知道你可以这样做:
#define VAR1 1
#define VAR2 1
但是,这有点痛苦,因为现在有代码复制和更多机会搞砸了。这是唯一的解决方案吗?
#define VAR1 1
#define VAR2 VAR1
编辑:正如各种评论所指出的,预处理器有宏,而不是变量。对不起。
答案 0 :(得分:3)
ISO C标准没有描述任何预处理指令,它将相同的替换序列分配给多个符号。即这种事情并不存在于标准中:
// fantasy syntax:
#definemulti (A B C) replacement token sequence
由于替换序列可以包含多个令牌,因此必须要么必须在某处使用括号,或者使用某种其他方式来判断名称的结束位置和替换序列。
在28年的C编码中,我还没有看到任何需要编译器具有这种扩展的代码片段。即使你找到一个将其作为扩展的编译器,使用它的非便携性也是如此。几乎不值得。
将这种语言引入语言可能会遇到障碍,因为它只会节省少量的输入。
此外,我们可以提出一个技术论证这是一个错误。
假设我们有几个编译时参数 - A
,B
和C
- 用于调整代码的行为。它们碰巧具有相同的值,因此我们将它们定义在一行中。
如果稍后它们不再具有相同的值,则必须编辑程序以将不同的值拆分为单独的#define
构造。例如:
#definemulti (A B C) 1
到这个
#definemulti (A C) 1
#define B 2
这会导致线条差异触及A
和C
。整个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
...
乍看之下,我们发现A
和C
未受影响,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
中的默认设置。