此后的这是一个后续问题(请将我的问题读到最后):
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更改为特殊的东西?提出这个问题后,我得到的印象可能是唯一的解决方案.. :)
答案 0 :(得分:3)
编译评论以作出答案:
解决方案A,
如果你出于某种原因必须坚持" ROW"和" COL"在你的代码中(信用到melpomene):
enum { ROW = 100 };
enum { COL = 200 };
enum { ARRSIZE = ROW*COL };
解决方案B,
如果你可以自由选择标识符;更加强大,以便将来重复使用:
通过选择不同的,不冲突的,更长的标识符来避免命名冲突
我对短而明显的标识符有一种迷信的不信任,你遇到的冲突就是一个很好的例子。其他例子让我的雇主付出了相当多的时间和金钱。
(我已经看到其他地方的melpomene不再对答案的声誉感兴趣,非常有利可图。我认为在这里制作一个很好的Q / A对并且不会从melpomene中获取任何东西是值得的。)