【发布时间】:2017-10-08 13:38:31
【问题描述】:
这应该是一个非常基本的问题,我可以通过更改一些名称来避免这种情况,但我认为这里可能缺少一些东西。
我为这个问题做了一个最简单的代码。
conv.h :
1 struct convpar_ {
2 int K;
3 } convpar_;
test.c :
1 #include <stdio.h>
2 #include "conv.h"
3
4 #define K 7
5
6 typedef struct convpar_ convpar;
7
8 void func1(convpar cp)
9 {
10 printf("cp.K = %d\n", cp.K);
11 }
12
13 main()
14 {
15 convpar cp = {K};
16
17 func1(cp);
18 }
如果我这样做cc test.c -o test,我会得到
cc test.c -o test
test.c: In function 'func1':
test.c:13: error: expected identifier before numeric constant
我知道这是因为我在第 4 行将字符“K”定义为“7”,这使得第 10 行在预处理后出现printf("cp.7" = %d\n", cp.7);。当我将 convpar_ 的成员 K 的名称更改为其他名称(例如 Ki)时,这个问题就消失了。
但有时,当我想定义一个常量并且它恰好是我在定义变量的同一个文件中使用的全局变量或结构的成员变量时,有时会出现这种情况。解决这个问题的正确方法是什么? (这也适用于 C++)
【问题讨论】:
-
在
C++中,您可以使用命名空间。在C和C++,可以重命名。 -
不要使用宏 (
#define)。如果您想要一个常量,请使用const(或constexpr)变量(在命名空间中)。 -
使用
#if defind xxx声明。 -
@JesperJuhl 我可以使用定义宏来定义另一个宏。但是对于 const 类型,不能。我可以在函数中使用 const 类型来定义变量。如果我想声明一个静态数组并且我想使用定义宏上的一些操作来定义数组的大小怎么办?也许我会提出一个新问题..
-
初始化结构成员的正确语法是
convpar cp = { .K = K};,但这也会导致类似的编译错误。
标签: c++ c scope preprocessor