c - 当其他宏引发名称冲突时,如何使用其他宏定义宏

标签 c scope macros

这是对此的后续问题(请阅读我的问题到最后): how to avoid name conflicts coming from #define in C? (or C++) 假设我 #define 宏 ROW 和 COL。然后我使用 ROW 和 COL #define ARRSIZE。然后,我声明了一个静态数组,如 float myarray[ARRSIZE];。现在,如果我修改 ROW 和 COL,静态数组大小会相应改变。但在我的特殊情况下,ROW 和 COL 的名称与我在同一文件中使用的结构类型的成员名称冲突。有人告诉我使用 const 变量而不是使用“#define”来避免冲突。我喜欢这个想法并修改了代码,如下所示(这是一个示例)。

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,
如果您可以自由选择标识符;对 future 的重用更稳健:
通过选择不同的、不冲突的、更长的标识符来避免命名冲突。
我迷信地不信任简短、明显的标识符,您遇到的冲突就是一个很好的例子。其他例子让我的雇主花费了相当多的时间和金钱。

(我在其他地方看到 melpomene 不再对答案的声誉感兴趣,非常无私。我认为值得在这里做一个很好的 Q/A 对,并且不会从 melpomene 那里拿走任何东西。)

关于c - 当其他宏引发名称冲突时,如何使用其他宏定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43884007/

相关文章:

c - 文件传输仅在服务器断开连接时完成

objective-c - NSUInteger C 数组

java - Spring session 作用域 bean,线程安全

javascript - 功能问题(javascript)

javascript node.js 模块之间的变量共享

windows - 如何编写函数或宏以将参数发送到 gVim for Windows 中的系统调用?

c++ - WxWidget ID 问题

clojure - Clojure 中有超过 1 个可变参数重载的多参数函数的解决方法吗?

c++ - 了解函数是否在运行时获取引用或值

iphone - 在 Objective-C 中四舍五入到 (1, 2, or 5) x 10^n?