代码仍然在没有任何包含的情况下运行(流血&x27;s Dev-C&&x2B;&x2B;)

代码仍然在没有任何包含的情况下运行(流血&x27;s Dev-C&&x2B;&x2B;),c,include,header-files,dev-c++,C,Include,Header Files,Dev C++,我目前正在学习和试验C,并将其用作IDE 现在,我刚刚意识到以下代码段(实际上是…不包含或不包含)编译并运行: main () { printf("%d", strlen("hello")); } 现在,如果我没有弄错的话,这个源代码中不应该包含两个头文件,这样它才能工作吗stdio.h和string.h…但正如您所看到的,我没有添加它们,代码仍然编译并成功运行 我的抱怨是,我希望编译器是“严格的”,因为我还在学习C语言,我不希望代码正常运行 那么,有没有办法防止DEV-C++在“

我目前正在学习和试验C,并将其用作IDE

现在,我刚刚意识到以下代码段(实际上是…不包含或不包含)编译并运行:

main ()
{
    printf("%d", strlen("hello"));  
}
现在,如果我没有弄错的话,这个源代码中不应该包含两个头文件,这样它才能工作吗
stdio.h
string.h
…但正如您所看到的,我没有添加它们,代码仍然编译并成功运行

我的抱怨是,我希望编译器是“严格的”,因为我还在学习C语言,我不希望代码正常运行


那么,有没有办法防止DEV-C++在“<代码> >包含< /代码> s时,即使它更“严格”?

< P>我不知道这是否是DevC +问题,但无论如何你应该考虑放弃它。它不再被开发,而且是非常多车的。我建议改为,这在各方面都更好,并且允许您使用最新的GCC编译器。

如果调用变量函数而没有可见原型,则可能出现“未定义行为”的情况,即代码编译和运行成功

如果您使用gcc作为底层编译器,那么您应该能够传递标志,例如
-std=c89-pedantic-Wall-Wextra
,并获得关于代码的警告,例如您发布的代码段。

C90有一个功能(没有C99和C++)调用隐式函数声明:当您在函数调用中使用尚未声明的名称时,编译器的行为就像

extern int identifier();
有人看见了。这一特性已经从C99中删除,甚至在C99发布之前,大多数编译器都可以选择对此发出警告

即使在C90中,也不建议使用此样式。如果您必须使用此功能维护代码,并且无法添加原型,请检查:

  • 函数返回int(printf就是这种情况,但strlen的有效性取决于实现,strlen返回的大小可以是int或其他值)

  • 函数不是可变的(strlen是这种情况,但printf不是)

  • 默认参数升级(char、short、float are)不会修改参数的类型,您必须注意将指针强制转换为void*。需要时,如果预期类型为void*,则必须注意将NULL强制转换为正确的指针类型。(顺便说一句,对于可变参数,这些都是您必须注意的事情)


如果不满足这些条件——并且这些条件不适用于代码中的任何调用——您将进入未定义行为的领域。

已下载并正在试用code::Blocks;感谢它不是DEV-C++问题,它是C99的一个C99和C++的特性,事实上,它是一个DEVC++问题,因为编译器的版本是古老的。当前的gcc版本警告缺少原型。-Wimplicit函数声明在-Wall中,因为至少gcc 2.95。c90或gcc90模式下的GCC4.3在未请求至少-Wimplicit函数声明的情况下仍然不会发出警告(我这里没有现成的4.4可供检查,但查看gcc.gnu.org上的在线文档,我认为它没有改变)。请注意,此警告与原型的存在无关,而是与隐式声明有关。gcc 2.95中似乎也提供了控制原型检查的所有选项。在gcc 4.4.0中,使用命令行“gcc f.c”,我得到了关于printf的警告。+1感谢这一非常有趣的信息;我不知道这件事。您还忘记了
main
的返回类型。