c++ - 如何正确使用作为其他定义参数的定义? C++

标签 c++ macros

我有以下定义宏:

#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/

相关文章:

macros - Clojure 宏定义令人困惑

Javascript 宏 : implementing F# style forward pipe operator

JavaScript 宏录制器

c++ - 为什么 QFontMetrics::maxWidth 会返回这么大的值?

c++将const对象引用传递给函数

c++ - 在结构 vector C++ 中搜索值的范围

c++ - 使用 QuickFIX 指定 FIX 消息中的字段顺序

java - Android NDK、JNI、蓝牙 : Designing the Android Application which is having C++ source code/library with Bluetooth APIs/methods , 使用 JNI

带有宏的 C++ 嵌套命名空间

c - 如何使用 C 中的宏计算表达式的一部分?