c - 宏中的数学是在编译时计算的吗?

标签 c macros build-process

例如,下面的 MIN_N_THINGIES 是否编译为 2?或者我会在每次在代码中使用宏时重新计算除法(例如,每次迭代重新计算 for 循环的结束条件)。

#define MAX_N_THINGIES  (10)
#define MIN_N_THINGIES  ((MAX_N_THINGIES) / 5)

uint8_t i;
for (i = 0; i < MIN_N_THINGIES; i++) {
  printf("hi");
}

这个问题源于我仍在学习构建过程这一事实。谢谢!

最佳答案

如果您将 -E 传递给 gcc,它将显示预处理器阶段输出的内容。

gcc -E test.c |尾-n11

输出:

# 3 "test.c" 2

int main() {
uint8_t i;
for (i = 0; i < ((10) / 5); i++) {
  printf("hi");
}
return 0;
}

然后,如果您将 -s 标志传递给 gcc,您将看到该部门已被优化。如果您还传递了 -o 标志,您可以设置输出文件并对它们进行比较以查看它们生成了相同的代码。

gcc -S test.c -o test-with-div.s
edit test.c to make MIN_N_THINGIES equal a const 2
gcc -S test.c -o test-constant.s
diff test-with-div.s test-constant.s
// for educational purposes you should look at the .s files generated.

然后如另一条评论中所述,您可以使用 -O... 更改优化标志

gcc -S test.c -O2 -o test-unroll-loop.s

即使没有循环也会展开 for 循环。

关于c - 宏中的数学是在编译时计算的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23019521/

相关文章:

c++ - Dynamic#include 基于宏定义

c++ - 宏 C++ #define Examples(obje) (::f(s, (obje), arg1, arg2, arg3))

c++ - 在 autotools 项目中包含一个(仅 header )库

build-process - 在自动构建中生成文档

configuration - 一台机器上的多个奴隶与 hudson

c - 如何将2个链表中的元素复制到新的链表中

c - 读取数组时发生访问冲突

C语言中无法逆序打印字符串

c - 发送带有二进制 null '\0' 的字符串

c++ - C++ 宏中的随机数