检查函数是否在C中定义有效吗


void f();
int main(int argc, char** argv)
{
if (f)
{
// other code
}
}

对于VS2017,链接器抱怨未解决的外部符号,而它与GCC一起工作。根据C99规范,它有效吗?或者是实现细节?

C标准要求在正确的程序中每个符号都应该被定义一次,但如果不遵守规则,则不需要任何诊断。因此,如果您声明一个从未在任何编译单元中定义过的函数,则该函数的任何使用都超出了C规范的范围。

众所周知,gcc编译器有很多扩展,其中一些扩展也被clang所接受。如果你知道你只会使用gcc,你可以使用它们,如果你想写可移植程序,你不应该。

GCC将声明的函数视为始终存在,即使使用-O0也是如此,因此将代码优化为:

#include <stdio.h>
int main(int argc, char** argv)
{
printf("Yn");
}

如果在编译器命令行中添加常见的警告选项,GCC也会对此发出警告。

检查是否定义了弱函数(通常是用户定义的回调(。

不,它永远不会完成,因为它不可能完成。您的代码可能有一些指向函数的指针,您可以检查这些指针是否为NULL(即已分配了一些函数指针引用,但无法检查这些引用是否正确(。

相关内容

最新更新