C++/C#定义宏计算

标签 c++ c macros

假设我有

#define DETUNE1 sqrt(7)-sqrt(5)
#define DETUNE2 sqrt(11)-sqrt(7)

我在我的程序中多次调用这些。

DETUNE1 和 DETUNE2 是否在每次被调用时计算?

最佳答案

Are DETUNE1 and DETUNE2 calculated every time it is called?

不太可能

因为您使用常量调用 sqrt,大多数编译器会优化对 sqrt 函数的调用并将其替换为常量值。 GCC 在 -O1 处执行此操作。 clang也是。 (See live)。

在一般情况下,如果您有一个将 n 作为运行时值的宏:

#define DETUNE1(n) (sqrt(n)-sqrt(n))

然后在文本替换之后,至少 sqrt 函数之一需要计算。

请注意您的宏安全。为了安全起见,你应该在它周围加上括号。例如,DETUNE1 * DETUNE1 不会产生您期望的结果。

关于C++/C#定义宏计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30995253/

相关文章:

c++,我可以使用 enable_if 而不是复制粘贴来启用多个特征类特化吗?

c++ - 使用 fgetc/fwrite 的简单字节更改失败

c - 二维数组类型错误

c++ - 来自文字的静态 std::string 对象的宏

c - 为什么 C 宏被截断?

macros - Clojure - 引用困惑

c++ - 如何为钩子(Hook)创建蹦床功能

c++ - 将 matlab 内联命令转换为不同的

c - 没有明确长度的 sizeof 数组

c - 使用多个相同数组的结构 - 查找 float 的平均值