如果我使用printf
,scanf
,puts
或C(非C ++)中的其他函数并且不编写包含行,可以将其视为未指定或未定义行为?
我记得,C根本不需要porotope声明,但建议让它们允许编译器在调用时进行类型转换。 printf
和其他此类函数的原型仍然不需要,不确定自定义函数。
PS:这个问题与https://codegolf.stackexchange.com/a/55989/32091的评论中的讨论有关。
答案 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
会产生错误的计算。