GCC警告:函数'puts'的隐式声明在C99中无效

我开始了Zed Shaw的学习C的艰难之路。 我已经下载了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 /目录/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)

请帮忙。


你需要包含stdio.h,即

#include <stdio.h> 

在开始导入函数定义。


这本“书”应该改名为“ 学习憎恨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 (在这个答案的写作之前18年,几乎在“书”写出之前的几年),在1989年,这个标准就会变得很糟糕,所以C标准被修改了。 在C99修订版中,这种隐式函数声明是非法的 - 当然,它在当前的标准修订版(C11)中仍然是非法的。 因此,如果使用puts 而不包含#include相关头文件,即预先包含#include <stdio.h> (或者用int puts(const char*); )声明puts函数是一个约束错误

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

链接地址: http://www.djcxy.com/p/85885.html

上一篇: GCC Warning: implicit declaration of function 'puts' is invalid in C99

下一篇: how to change the default compiler on mac osx 10.8.2