最后包括#include文件

时间:2014-08-23 03:06:34

标签: c

我有一个面试问题,面试官问我从下面的输出中得到什么错误:

int main()
{    
    printf("hello world");
    return 0;
}

#include <stdio.h>

我回答“没有错误”,它会显示输出。

任何人都可以帮我这个吗?

请注意“缺少的尖括号是我故意做的,所以不要为此烦恼”

4 个答案:

答案 0 :(得分:7)

这取决于编译器。

大多数C编译器可能接受该代码(可能带有警告)并生成可执行文件以打印预期的输出。

根据C90规则,printf调用的行为未定义;调用没有可见原型的可变参数函数是无效的。变量函数可以具有与普通函数不同的调用约定,并且您必须让编译器知道printf是可变参数,因此它可以为调用生成正确的代码。

在C99及更高版本的规则下,调用任何没有可见声明的函数(可能是也可能不是原型)都是约束违规,至少需要编译时警告。

如果你在没有所需原型的情况下调用printf,标准并没有暗示会发生什么,但实际上大多数编译器都会正确地处理它#34; <#p>;

输出末尾缺少'\n'意味着程序的行为未定义如果实现需要输出结尾的换行符;这是否需要是实现定义的。无论如何,添加换行符是一个好主意。

源文件末尾的#include <stdio.h>应该没用,但无害。

我假设源文件实际上包含#include <stdio.h>而不是#include stdio.h;后者将是语法错误。

(实际上,当然,#include <stdio.h> 应该位于顶部。在专业设置中,输出无关紧要,因为程序永远不会在代码审查中存活下来。)

答案 1 :(得分:1)

<>的文件名中缺少引号或#include会出错。它应该是:

#include <stdio.h>

除此之外,它应该编译一个关于printf()的隐式声明的警告。在Clang上,它给了我:

test.c:3:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
    printf("hello world");
    ^

答案 2 :(得分:0)

当你的main()函数被声明时,编译器会遇到main()的第一行,它不知道printf()是什么。您将收到有关编译器抱怨未声明函数的错误。

当然,假设您在复制问题时引入了错误的<>错误。

答案 3 :(得分:0)

这里有两个错误。第一个是include指令必须在需要头信息的代码之前发生,在这种情况下printf()在stdio.h中声明,第二个是include指令中的文件名必须用尖括号括起来,&lt ;&gt;,或引号,&#34;&#34;。