在C中删除#include <stdio.h>是否正确?

时间:2015-09-04 12:43:08

标签: c undefined-behavior

如果我使用printfscanfputs或C(非C ++)中的其他函数并且不编写包含行,可以将其视为未指定或未定义行为?

我记得,C根本不需要porotope声明,但建议让它们允许编译器在调用时进行类型转换。 printf和其他此类函数的原型仍然不需要,不确定自定义函数。

PS:这个问题与https://codegolf.stackexchange.com/a/55989/32091的评论中的讨论有关。

4 个答案:

答案 0 :(得分:2)

对于职业发展,没有。

对于codegolfing,没关系。

如果您没有声明函数,编译器会自动生成一个函数,该函数可能与其真实声明匹配,也可能不匹配。如果没有,它可能会或可能不会产生段错误或软件错误。 gcc在这种情况下也会发出警告。

答案 1 :(得分:2)

  

在C中删除#include是否正确?

不,这不对。如果您使用stdio.h这样的printf函数,请务必包括它。

C已删除隐式声明(使用C99),并且包含是必需的。唯一的另一种选择是为printf提供可见的原型声明。

此外,即使C具有隐式声明,隐式声明也不适用于变量参数函数;所以在C89中没有添加stdio.h包含且没有可见原型(对于printf示例)是未定义的行为。

答案 2 :(得分:1)

stdio.h对您要使用的函数有显式声明,如果是C ++编译器(例如g ++),则禁止这样做。 由于c ++需要所有函数的显式声明,但任何正确的C compiler都会创建这些函数的隐式声明,将代码编译为目标文件,并在链接时使用标准库,它会找到那些意外地与隐式声明匹配的函数的定义,可能gcc会给你一个警告。

因此,如果您正在编写您想要可维护和可读的软件,那么就不能选择放弃它,但是对于快速原型设计或代码挑战,这可能并不那么重要。

答案 3 :(得分:0)

从技术上讲,在很多情况下你可以跳过#include。但对于某些函数,编译器无法在没有原型的情况下生成正确的函数调例如。如果一个参数是double而你放0 - 原型它将被转换并存储为堆栈中的double值,否则会int会产生错误的计算。