在C,使用其他的宏,当其他宏筹集名称冲突如何定义一个宏(In C, how to define a

2019-09-29 07:40发布

这是在此之后的后续问题(请阅读我到底问题): 如何避免名称冲突从未来的#define用C? (或C ++)假设我使用#定义ROW和COL。 我然后使用ROW和COL定义ARRSIZE。 我声明一个静态数组像float myarray[ARRSIZE]; 。 当我修改ROW和COL,静态数组的大小相应地改变。 但在我的特殊情况下,名称以我使用同一个文件结构类型的成员名称行和COL名称冲突。 有人告诉我使用的,而不是使用“#定义”,以避免confict常数变量。 我喜欢我的体改代码beloow(这是<br/>的一个实例)。

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

Compling这给了我

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到一些特别的东西? 已经问过这个问题,我得到的印象,可能是唯一的解决办法.. :)

Answer 1:

编译的意见作出答复:

方案A,
如果由于某种原因,必须坚持在你的代码“行”和“COL”(学分墨尔波墨涅):

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

方案B,
如果你可以自由选择标识; 更强大的以备将来使用:
避免通过选择不同的,不矛盾的,不再identfiers命名冲突。
我有短,明显的标识的迷信不信任,你所遇到的冲突是一个很好的例子,为什么。 其他的例子花费我的雇主相当长的一段时间和金钱。

(我见过墨尔波墨涅其他地方不感兴趣的一个答案的声誉了,很altruistical。我认为这是值得做一个很好的Q / A对这里并没有考虑从墨尔波墨涅任何事情。)



文章来源: In C, how to define a macro using other macros, when that other macros raise name conflicts
标签: c scope macros