Visual Studio 检查函数是否在C中定义是否有效?

ogsagwnx  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(187)
void f();
int main(int argc, char** argv)
{
    if (f)
    {
        // other code
    }
}

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

1tuwyuhd

1tuwyuhd1#

C标准要求每个符号在一个正确的程序中应该被定义一次,但是如果不遵守这个规则,就不需要任何诊断。所以如果你声明了一个从未在任何编译单元中定义过的函数,那么对这个函数的任何使用都超出了C规范。
众所周知gcc编译器有大量的扩展,其中一些也被clang接受,如果你知道你只会使用gcc,你可以使用它们,如果你想写可移植程序你不应该。

z0qdvdin

z0qdvdin2#

GCC regards a declared function as always existent,甚至-O0,因此优化代码以:

#include <stdio.h>

int main(int argc, char** argv)
{
    printf("Y\n");
}

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

cygmwpex

cygmwpex3#

通常检查嵌入代码中是否定义了弱函数(通常是用户定义的回调)。
你的代码可能有一些指向函数的指针,你可以检查这些指针是否为空(即已经被分配了一些函数指针引用,但不能检查这些引用是否正确)。

相关问题