我有以下定义宏:
#define NHID 5
#define NENT 10
#define NOUT 4
#define NWEIS (NENT + 1) * NHID + (NHID + 1) * NOUT
因此,每次编译器找到“NWEIS”时,它都会用“(NENT + 1) * NHID + (NHID + 1) * NOUT”替换“NEWIS”。但这不是我想要的。我希望它用实际值 = 79 替换“NWEIS”,而不必在内存中声明额外的变量。有没有合适的方法来做到这一点?
最佳答案
宏替换主要是1一个迭代过程。
在宏替换之后,您将得到一个带有常量的表达式。并且任何体面的编译器都能够折叠这些常量(在编译时评估它们)为您提供 79
的单个值。
例如,考虑程序:
#define NHID 5
#define NENT 10
#define NOUT 4
#define NWEIS (NENT + 1) * NHID + (NHID + 1) * NOUT
int main (void) { return NWEIS; }
这是 gcc -E
的预处理器输出:
int main (void) { return (10 + 1) * 5 + (5 + 1) * 4; }
这是它用 gcc -S
生成的相关汇编代码行(返回值放在 eax
寄存器中):
movl $79, %eax
话虽如此,由于您拥有常量“变量”、对编译器的内联建议、枚举类型等等,宏过去非常有用的所有事情,因此没有什么理由再使用宏了。
当然,我仍然发现自己在使用宏来编写快速的'n'dirty 代码,但这主要是因为我是一个老手,在我们甚至没有原型(prototype)之前的早期 C 时代伪造:-)
可能也值得重新考虑您对它们的使用,因为您可以用类似的东西替换它:
const int nhid = 5;
const int nent = 10;
const int nout = 4;
const int nweis = (nent + 1) * nhid + (nhid + 1) * nout;
智能编译器应该仍然能够在编译时优化计算,您很可能会发现调试器中的变量对您可用,而这通常不会发生用宏。
1 可以在 C++11 标准的 16.3 宏替换
部分找到完整的详细信息。
足以说明 #
和 ##
在宏中的某些用途可以防止进一步替换 that 标记(前者替换带有字符串文字的标记,后者将多个标记组合成一个不同的标记。
因为您没有使用它们,所以它在这里无关紧要。
关于c++ - 如何正确使用作为其他定义参数的定义? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427656/