预处理器后的C代码
这是一本书上的练习。问题是这段代码的输出是什么 这段代码总是打印“N未定义”,但我不知道为什么。命令“#undef N”位于函数f之后。那么,为什么输出总是“N未定义”预处理器后的C代码,c,C,这是一本书上的练习。问题是这段代码的输出是什么 这段代码总是打印“N未定义”,但我不知道为什么。命令“#undef N”位于函数f之后。那么,为什么输出总是“N未定义” 因为预处理器指令以“物理”顺序运行,一行接一行 想想看,在实际编译之前会执行一些操作,这样您的代码就很清晰了,只有编译器使用纯C代码。因为预处理器指令是按“物理”顺序逐行运行的 想想看,在实际编译之前会执行一些操作,这样你的代码就很清楚了,只有编译器使用纯C代码。本练习的目的是证明预处理器的控制流与程序的控制流完全分离 #if/
因为预处理器指令以“物理”顺序运行,一行接一行
想想看,在实际编译之前会执行一些操作,这样您的代码就很清晰了,只有编译器使用纯C代码。因为预处理器指令是按“物理”顺序逐行运行的
想想看,在实际编译之前会执行一些操作,这样你的代码就很清楚了,只有编译器使用纯C代码。本练习的目的是证明预处理器的控制流与程序的控制流完全分离
#if
/#undef
指令按照它们在程序文本中出现的顺序进行处理。它们在编译时只处理一次;无法在运行时重新考虑定义或取消定义预处理器变量的决定
这就是为什么
f
在#if
/#undef
行之前执行main
这一事实是不相关的。只有将f
移动到main
之前的文件位置,才能更改此程序的输出。此练习的目的是演示预处理器的控制流与程序的控制流完全分离
#if
/#undef
指令按照它们在程序文本中出现的顺序进行处理。它们在编译时只处理一次;无法在运行时重新考虑定义或取消定义预处理器变量的决定
这就是为什么
f
在#if
/#undef
行之前执行main
这一事实是不相关的。只有将f
移动到main
之前的文件位置,才能更改此程序的输出。如果使用-E标志运行编译器(至少对于gcc),它将显示实际编译的代码
您将看到,预处理器并不遵循代码执行,而是按照它们在文件中出现的顺序执行其操作
然后编译器获取结果代码,
f
中只有一个对printf
的调用,表示N未定义。如果使用-E标志运行编译器(至少对于gcc),它将显示实际编译的代码
您将看到,预处理器并不遵循代码执行,而是按照它们在文件中出现的顺序执行其操作
然后编译器获取结果代码,
f
只在其中调用了一个printf
,表示N未定义。C预处理器逐行检查代码。因此,由于函数调用,假定#unde
发生在函数f()
之后是错误的。相反,它发生在函数f()
的定义之前
要理解这一点,必须区分预处理器(逐行)和控制流(遵循函数调用)。C预处理器逐行检查代码。因此,由于函数调用,假定
#unde
发生在函数f()
之后是错误的。相反,它发生在函数f()
的定义之前
要理解这一点,您必须区分预处理器(逐行)和控制流(遵循函数调用)
#define N 100
void f(void);
int main(void)
{
f();
#ifdef N
#undef N
#endif
return 0;
}
void f(void)
{
#if defined(N)
printf("N is %d\n", N);
#else
printf("N is undefined\n");
#endif
}