void f(); int main(int argc, char** argv) { if (f) { // other code } }
在VS2017中,链接器抱怨未解析的外部符号,而它与GCC一起工作。根据C99规范,它是有效的吗?或者它的实现细节?
1tuwyuhd1#
C标准要求每个符号在一个正确的程序中应该被定义一次,但是如果不遵守这个规则,就不需要任何诊断。所以如果你声明了一个从未在任何编译单元中定义过的函数,那么对这个函数的任何使用都超出了C规范。众所周知gcc编译器有大量的扩展,其中一些也被clang接受,如果你知道你只会使用gcc,你可以使用它们,如果你想写可移植程序你不应该。
z0qdvdin2#
GCC regards a declared function as always existent,甚至-O0,因此优化代码以:
-O0
#include <stdio.h> int main(int argc, char** argv) { printf("Y\n"); }
如果您在编译器命令行中添加了常见的警告选项,GCC也会就此发出警告。
cygmwpex3#
通常检查嵌入代码中是否定义了弱函数(通常是用户定义的回调)。你的代码可能有一些指向函数的指针,你可以检查这些指针是否为空(即已经被分配了一些函数指针引用,但不能检查这些引用是否正确)。
3条答案
按热度按时间1tuwyuhd1#
C标准要求每个符号在一个正确的程序中应该被定义一次,但是如果不遵守这个规则,就不需要任何诊断。所以如果你声明了一个从未在任何编译单元中定义过的函数,那么对这个函数的任何使用都超出了C规范。
众所周知gcc编译器有大量的扩展,其中一些也被clang接受,如果你知道你只会使用gcc,你可以使用它们,如果你想写可移植程序你不应该。
z0qdvdin2#
GCC regards a declared function as always existent,甚至
-O0
,因此优化代码以:如果您在编译器命令行中添加了常见的警告选项,GCC也会就此发出警告。
cygmwpex3#
通常检查嵌入代码中是否定义了弱函数(通常是用户定义的回调)。
你的代码可能有一些指向函数的指针,你可以检查这些指针是否为空(即已经被分配了一些函数指针引用,但不能检查这些引用是否正确)。