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

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

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

对此进行处理给了我

 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更改为特殊的东西? 问过这个问题后,我得到的印象可能是唯一的解决方案.. 🙂

编译评论以作出答案:

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

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

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

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