当其他宏引发名称冲突时,如何使用其他宏定义宏 [英] How to define a macro using other macros, when those other macros raise name conflicts
问题描述
这是对此的后续问题(请仔细阅读我的问题):如何避免名称冲突来自#用C定义?(或C ++)假设我#define宏ROW和COL.然后,我使用ROW和COL #define ARRSIZE.然后,我声明一个静态数组,例如 float myarray [ARRSIZE];
.现在,如果我修改ROW和COL,则静态数组大小将相应更改.但是在我的特殊情况下,ROW和COL的名称与我在同一文件中使用的结构类型的成员名称冲突.有人告诉我使用const变量,而不要使用'#define'以避免冲突.我喜欢这个主意,并修改了代码,如下所示(这是一个示例).
This is a follow-up question to this (please read my question to the end) :
how to avoid name conflicts coming from #define in C? (or C++)
Suppose that I #define macros ROW and COL. I then #define ARRSIZE using ROW and COL. Then, I declare a static array like float myarray[ARRSIZE];
. Now if I modify ROW and COL, the static array size changes accordingly. But in my special case, the names of ROW and COL conflict with a member name of a struct type I'm using in the same file. Someone told me to use a const variable instead of using '#define' to avoid the conflict. I liked the idea and modifed the code as shown below (it's an example).
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进行操作不会有任何问题(名称冲突除外).
at the line where I define ARRSIZE. Of course I can use int ARRSIZE = ROW*COL;
inside a function and dynamically allocate the array inside the function with malloc. But what if I want to change only ROW and COL and don't want to use malloc? Of course, there is no problem (except the name conflicts) when doing it with #define.
#define ROW 100
#define COL 200
#define ARRSIZE ROW*COL
float myarray[ARRSIZE];
所以有一个问题:我只想更改ROW,COL,并希望自动更改静态数组的大小,但是同时,ROW和COL在同一源文件中显示为结构的成员变量.我无法确定结构成员的名称.总之,我想定义一个不应用于成员函数/变量或全局变量的类似宏的值".在我的情况下,最好的做法是什么?只是将变量ROW和COL更改为特殊的东西?问了这个问题后,我得到的印象是,这可能是唯一的解决方案..:)
So the problem: I want to change only ROW, COL and want the static array size automatically changed, but at the same time, ROW and COL appear as a member variable of a struct in the same source file. I cannot fix the name of the struct member. So in a word, I want to define a 'macro like values' that are not applied to a member function/variable nor global variables. What is the best practice to do it in my case? Just changing the variables ROW and COL to something special? Having asked this question, I get an impression that, that may be the only solution.. :)
推荐答案
编译注释以给出答案:
解决方案A,
如果您由于某种原因不得不在代码中坚持使用"ROW"和"COL"(获得美尔康宁的积分):
Solution A,
if you for some reason have to stick with "ROW" and "COL" in your code (credits to melpomene):
enum { ROW = 100 };
enum { COL = 200 };
enum { ARRSIZE = ROW*COL };
解决方案B,
如果您可以自由选择标识符;为将来的重用提供更强大的功能:
通过选择不同的,非冲突的,更长的标识符来避免命名冲突.
我对简短,明显的标识符不屑一顾,您遇到的冲突就是一个很好的例子.其他例子使我的雇主花费了很多时间和金钱.
Solution B,
if you are free to choose identifiers; more robust for future reuse:
Avoid the naming conflict by choosing different, non-conflicting, longer identfiers.
I have a superstitious distrust of short, obvious identifiers, the conflict you encountered is a good example why. Other examples have cost my employers quite some time and money.
(我发现其他地方的美洛美犬对答案的声誉不再感兴趣,非常无私.我认为值得在这里做一个不错的Q/A配对,而从美洛美尼身上吸取任何东西.)
这篇关于当其他宏引发名称冲突时,如何使用其他宏定义宏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!