【发布时间】:2012-05-14 03:17:19
【问题描述】:
如果我有这样的宏:
#define MAX_SIZE ((1<<18)-1)
我可以放心,到运行时,这个数学运算已经完成并且 MAX_SIZE 是一个文字。
我的问题是,如果我使用 __builtin 函数,例如:
#define BIT_OFFSET (__builtin_clz(MAX_SIZE))
这是否也会在运行时变成一个常数?
【问题讨论】:
-
宏是纯文本替换。如果
__builtin_clz()不是宏,它会在运行时执行。大多数编译器都有一个标志,如果你想看看到底发生了什么,它将输出你的文件后预处理。 -
__builtin_*系列函数不是 gcc 内部函数,暗示除非明确禁用,否则它们会被内联? -
GCC 内在函数是 GCC 内在函数,而不是宏。有时它们是通过函数调用实现的,有时它们是内联的,有时它们是在编译时评估的。我不知道这个特定的是否可以在编译时评估。
-
我不是 100% 确定,但我认为 GCC 的所有
__builtin_*函数都是特殊情况下的常量参数并生成一个常量结果,该结果可以在 C 的“常量表达式”意义上使用(即,您甚至可以将它们用作位域宽度、结构中数组的大小等)。 -
@R.. 文档中没有任何说明,我们可以确定 __builtin_abort 等不会产生恒定的结果。