【发布时间】:2019-06-29 16:15:00
【问题描述】:
考虑这个程序:
#define MACRO \
srand(time(NULL)); \
if (rand() % 2) \
printf("A"); \
else \
printf("B");
int main() {
MACRO;
}
相当于下面的宏扩展程序:
int main() {
srand(time(NULL));
if (rand() % 2)
printf("A");
else
printf("B");
}
显然,if 语句是在运行时而不是在宏扩展阶段执行的。如果if 语句是在编译时执行的,并且如果有语法引用(如在 Lisp 中),我们可以(几乎)相等的概率得到程序 A 和 A'。答:
int main() {
printf("A");
}
和A':
int main() {
printf("B");
}
有没有办法让 GCC 针对编译时评估的条件发出 A 或 A'?
【问题讨论】:
-
您是在问预处理器是否可以生成随机数?不,但您可以使用
-D将/dev/urandom的输出传递给编译器,并使用#if预处理器指令。 -
gcc -DMACRO=printf("A"); test.c或gcc -DMACRO=printf("B"); test.c怎么样 -
当预处理器扩展
MACRO;时,它会创建一个空语句srand ... ("B");;,因为您的宏通常以分号结尾。只是说......空语句没有问题。 -
谢谢@EugeneSh.and @cleblanc。使用
-D选项,我们只需从代码库外部提供宏,对吗?它不会使预处理器做任何不同于我们将宏放在代码库中的工作。 -
谢谢@ChristianGibbons,这是一个错字。虽然,当我查看
macro标签的描述时,它可能不是我可以放在这里的最好的标签。 :)