C语言中检查函数是否定义的写法合法吗?C99标准层面解析
C99标准下函数名直接用于条件判断的合法性分析
void f(); int main(int argc, char** argv) { if (f) { // other code } }
语法与标准约束分析
从语法角度看,if(f)的写法符合C99标准:C99规定,函数标识符在表达式中(除作为sizeof运算符操作数、&运算符操作数等少数例外场景)会被隐式转换为指向该函数的指针,因此这里的f等价于&f,作为条件判断是合法的语法写法。
但从程序合规性角度,这段代码违反了C99标准的约束:C99要求所有被程序引用的外部函数必须有对应的定义,而代码仅声明了void f();却未提供f的具体实现,这种情况属于标准定义的未定义行为——标准不对这种场景的执行结果做任何保证,具体行为由编译器实现决定。
编译器行为差异原因
- VS2017的链接器严格执行符号解析,发现
f只有声明无定义,直接抛出未解析外部符号错误,这是贴合标准对链接阶段要求的行为。 - GCC能“正常运行”是依赖了自身的扩展特性:对于未定义的函数符号,当仅被用作指针而非直接调用时,GCC会默认将其视为非空函数指针(具体表现可能受编译优化等级影响),这属于编译器的实现细节,并非C99标准强制要求的行为。
内容的提问来源于stack exchange,提问作者user20291889
相关产品推荐
相关产品推荐

