31

我正在开始 Zed Shaw 的Learn C The Hard Way。我已经下载了 XCode 和命令行工具。但是当我编译第一个程序时:

int main(int argc, char *argv[]) {
     puts("Hello world."); 
     return 0;
 }

我收到这个警告:

ex1.c:2:1:警告:函数“puts”的隐式声明在 C99 [-Wimplicit-function-declaration] 中无效

该程序确实编译并正确执行。

我正在使用 OSX 10.8.3。输入'gcc -v'给出:

使用内置规范。目标:i686-apple-darwin11 配置:/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents /Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/ ^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp /llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 -- with-gxx-include-dir=/usr/include/c++/4.2.1 线程模型:posix gcc 版本 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00)

请帮忙。

4

2 回答 2

50

你需要包括stdio.h,即

#include <stdio.h> 

在开始导入函数定义。

于 2013-06-01T20:41:17.307 回答
7

这本“书”应该重命名为通过遵循明显错误的无意义示例来学习讨厌 C。

现代 C 中的正确代码将简单明了

#include <stdio.h>        // include the correct header

int main(void) {          // no need to repeat the argument mantra as they're not used
    puts("Hello world."); 
}                         // omit the return in main as it defaults to 0 anyway

虽然原来的例子

int main(int argc, char *argv[]) {
    puts("Hello world."); 
    return 0;
}

在 1989 年,在1999 年(也就是在写这个答案之前 18 年,几乎在写“书”之前的很多年)C 标准被修订了,这本来会很糟糕。在 C99 修订版中,这种隐式函数声明是非法的 -自然在当前的标准修订版 (C11) 中仍然是非法的。因此,在不使用相关标头情况下使用,即在前面添加(或使用 声明函数)是一个约束错误puts #include#include <stdio.h>putsint puts(const char*);

约束错误是必须导致编译器输出诊断消息的错误。此外,此类程序被视为无效程序。然而,C 标准的特殊之处在于它允许 C 编译器也成功编译无效程序,尽管编译器也可能会拒绝它。因此,在一本应该向初学者教授 C 语言的书中,这样的例子并不是一个好的起点。

于 2017-09-28T21:04:33.567 回答