如何避免来自C中#define的名称冲突? (或C ++)

这应该是一个非常基本的问题,我可以通过更改一些名称来避免这种情况,但我想也许我在这里缺少一些东西。
我为这个问题编写了一个最简单的代码。

conv.h : 1 struct convpar_ { 2 int K; 3 } convpar_; test.c : 1 #include  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 ++)

您无法解决此问题,因为这是预处理器的目标:动态修改代码。 解决方案是采用良好的编码实践:不要将预处理器用于通用编程。 此外,使用命名空间的命名规则。 K什么? 将其命名为CONVERSION_ID_K,CONVERSION_ID_L,依此类推。 对变量等使用小写。