在C中,当其他宏引发名称冲突时,如何使用其他宏定义宏

时间:2017-05-10 05:11:25

标签: c scope macros

此后的这是一个后续问题(请将我的问题读到最后): how to avoid name conflicts coming from #define in C? (or C++) 假设我使用#define定义ROW和COL。然后我使用ROW和COL定义ARRSIZE。我声明了一个像float myarray[ARRSIZE];这样的静态数组。当我修改ROW和COL时,静态数组大小会相应地改变。但在我的特殊情况下,名称ROW和COL名称与在同一文件中使用的结构类型I的成员名称冲突。有人告诉我使用const变量而不是使用' #define'避免混淆。我喜欢我将代码修改为beloow(它是一个例子)。

const int ROW = 100;
const int COL = 200;
const int ARRSIZE = ROW*COL;
float myarray[ARRSIZE];

Compled this给了我

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ARRSIZE'

在我定义ARRSIZE的行。当然我可以在函数内使用int ARRSIZE = ROW*COL;并使用malloc在函数内动态分配数组。但是,如果我只想改变ROW和COL并且不想使用malloc怎么办?使用#define时,当然没有问题(名称冲突除外)。

#define ROW 100
#define COL 200
#define ARRSIZE ROW*COL
float myarray[ARRSIZE];

所以问题:我想只更改ROW,COL并希望自动更改静态数组大小,但同时,ROW和COL在同一源文件中显示为类型(结构)的成员变量,我无法修复该类型的成员名称(假设它来自系统提供的头文件)。总而言之,我想要定义一个像值一样的宏观'这不适用于成员函数/变量或全局变量。在我的案例中,最好的做法是什么?只是将我的变量ROW和COL更改为特殊的东西?提出这个问题后,我得到的印象可能是唯一的解决方案.. :)

1 个答案:

答案 0 :(得分:3)

编译评论以作出答案:

解决方案A,
如果你出于某种原因必须坚持" ROW"和" COL"在你的代码中(信用到melpomene):

enum { ROW = 100 }; 
enum { COL = 200 }; 
enum { ARRSIZE = ROW*COL };

解决方案B,
如果你可以自由选择标识符;更加强大,以便将来重复使用:
通过选择不同的,不冲突的,更长的标识符来避免命名冲突 我对短而明显的标识符有一种迷信的不信任,你遇到的冲突就是一个很好的例子。其他例子让我的雇主付出了相当多的时间和金钱。

(我已经看到其他地方的melpomene不再对答案的声誉感兴趣,非常有利可图。我认为在这里制作一个很好的Q / A对并且不会从melpomene中获取任何东西是值得的。)