代码仍然运行没有任何包含(Bloodshed的Dev-C++)

And*_*ech 2 c include header-files dev-c++

我目前正在学习和试验C,并使用Bloodshed的DEV-C++作为IDE.

现在,我刚刚意识到下面的一段代码(因为它是......不包括或没有)编译和运行:

main ()
{
    printf("%d", strlen("hello"));  
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我没有弄错的话,不应该在这个源中包含两个头文件以使其工作吗? stdio.hstring.h...但正如你所看到的,我没有添加它们,代码仍然编译并成功运行.

我的抱怨是我希望编译器"严格",因为因为我还在学习C,所以我不希望代码在正常情况下运行.

那么,有没有什么方法可以防止Dev-C++在纠正我的错误时使用它include,即使它更加"严格"?

APr*_*mer 7

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

extern int identifier();
Run Code Online (Sandbox Code Playgroud)

曾经见过.该功能已从C99中删除,大多数编译器都可以选择在C99颁布之前就此发出警告.

即使在C90停留,也不建议使用它.如果您必须维护使用此代码并且无法添加原型的代码,请检查:

  • 函数返回一个int(printf是这种情况,但有效性是依赖于strlen的实现,它返回一个size_t,可以是int或其他东西)

  • 函数不是variadic(strlen的情况,但不是printf)

  • 默认参数提升(char,short,float are)不会修改参数的类型,并且当需要时,当必需的类型为void*时,你必须注意将指针转换为void*,你必须注意将NULL转换为正确的指针类型.(对于可变参数BTW,你必须注意这些事情).

如果不满足这些条件 - 并且它们不适用于代码中的任何调用 - 则进入未定义行为的领域.