void f();
int main(int argc, char** argv)
{
if (f)
{
// other code
}
}
在使用VS2017时,链接器会抱怨未解决的外部符号,而在GCC中可以正常工作。根据C99规范,这是有效的吗?还是实现细节?
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("Y\n");
}
__attribute__((weak))
会让 GCC 不 把 if (f)
优化成 if (1)
。 - pmor
void f();
是一个声明,无论函数是否存在,它和if (f)
都可以编译通过。函数的存在与否只在链接时才有影响,而不是编译时。 - Eric Postpischilvoid f();
声明了函数f
,它在if (f)
中的使用导致其转换为指向函数的指针,并且该指针不能是空指针,因此if
语句总是为真。这就是你从标准中所能获得的全部信息。弱链接和测试函数是否可用超出了C标准的范围。 - Eric Postpischil