【发布时间】:2020-04-16 05:19:28
【问题描述】:
过去我曾经在 Turbo C 中进行 C 编程,如果你编写这个 C 程序:
int main(){
printf("Testing...!");
return 0;
}
只有在开头添加#include <stdio.h> 后才会起作用。但如果我在 CodeBlocks 中运行相同的程序,它就可以工作。
是编译器还是自动包含头文件的代码块?我该如何阻止呢?我是否需要将 Turbo C 编译器(我猜是 borland)配置为 CodeBlocks 而不是 MinGW(我目前正在使用)?
【问题讨论】:
-
我不认为 Code::Blocks 或编译器自己添加任何头文件。很可能您的警告级别太低,以至于不会弹出有关缺少声明的警告,或者 Code::Blocks 没有显示它。并且因为链接器愉快地链接到标准库,
printf()被找到并链接。将警告级别提高到最大! -- 刚试过:一个简单的gcc test.c -o test已经报告了丢失的声明。 -
但它应该将其报告为错误而不是警告。
-
没有原型的编程是 K&R 风格,并且仍然完成(!)... ;-) 一些编译器允许它,这取决于所要求的标准。不过,您可以让大多数编译器将警告作为错误发出。
-
请注意,GCC 4.x 及更早版本默认为 C90 标准,这或多或少允许问题中的代码 — 使用
puts()是安全的,但严格来说,函数采用变量参数列表,如printf(),即使在 C90 中也必须在范围内有一个原型(否则,行为是未定义的——这意味着它可能无论如何都可以工作,但不能保证)。 GCC 5.1 及更高版本默认为 C11(编译器从未默认为 C99),这意味着需要原型(嗯,函数声明,最好是原型)。
标签: c mingw codeblocks