Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预处理器后的C代码_C - Fatal编程技术网

预处理器后的C代码

预处理器后的C代码,c,C,这是一本书上的练习。问题是这段代码的输出是什么 这段代码总是打印“N未定义”,但我不知道为什么。命令“#undef N”位于函数f之后。那么,为什么输出总是“N未定义” 因为预处理器指令以“物理”顺序运行,一行接一行 想想看,在实际编译之前会执行一些操作,这样您的代码就很清晰了,只有编译器使用纯C代码。因为预处理器指令是按“物理”顺序逐行运行的 想想看,在实际编译之前会执行一些操作,这样你的代码就很清楚了,只有编译器使用纯C代码。本练习的目的是证明预处理器的控制流与程序的控制流完全分离 #if/

这是一本书上的练习。问题是这段代码的输出是什么

这段代码总是打印“N未定义”,但我不知道为什么。命令“#undef N”位于函数f之后。那么,为什么输出总是“N未定义”


因为预处理器指令以“物理”顺序运行,一行接一行


想想看,在实际编译之前会执行一些操作,这样您的代码就很清晰了,只有编译器使用纯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
}