C 宏观评估

标签 c gcc c-preprocessor

我想声明一个静态分配的数组。 让我们看一下下面的代码:

#define MAX(a,b) ((a)>(b)?(a):(b))
#define FAST            16
#define SLOW            6
#define MAX_NUM         MAX(FAST,SLOW)
U8*   pBuffers[MAX_NUM];

当 GCC 编译器评估 MAX_NUM 时(FAST 和 SLOW 是常量)? 我想确保 MAX_NUM 是常量并且作为编译的一部分或由预处理器进行评估。

最佳答案

启动编译器时,将(顺序)执行以下阶段:

  • 预处理:它管理#define、#ifdef/#endif ...
  • 代码生成:它生成可在 objective-c PU 上运行的机器代码
  • 优化:它根据用户选项进行优化

预处理阶段,预处理器将例如“替换”您的行:

U8*   pBuffers[MAX(FAST,SLOW)]

然后:

U8*   pBuffers[((FAST)>(SLOW)?(FAST):(SLOW))]

然后最后:

U8*   pBuffers[((16)>(6)?(16):(6))]

的确,预处理器不是很聪明,没有更进一步。

代码生成阶段,您的行将被解释为:

U8*   pBuffers[16]

因为代码生成器非常聪明。

关于C 宏观评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51766100/

相关文章:

c++ - 从整数到 [0,1] 浮点区间的函数

c - 如何在 GCC、windows XP、x86 中编写缓冲区溢出漏洞?

c - 过程关联表和全局偏移表

c++ - C++中的宏和预处理器指令有什么区别

C 预处理器指令运算符##

c - 产生无限循环的基本函数

c - 在 ANSI C 中解析 JSON

c++ - enable_if 的句法模式

c - 替换内联汇编代码

c - 在 C 中不使用 itoa 将 int 转换为二进制格式的方法?