如果未实现函数,则在链接时启用错误



我注意到,当使用G++链接项目时,如果有已声明但未实现的函数,则不会出现错误,除非我尝试调用它们。

Q1:如果函数已声明但未实现,是否可以启用错误(或至少警告)?

Q2:为什么会出现这种行为?

注意:我使用G++ 4.7.0ld 2.22,如果这是gcc使用的链接器,则来自mingw包)

A2:一个实体,如具有外部链接的非内联函数,在程序中可以有零个或一个定义。如果它被实际使用(严格意义上odr used),则只需要有一个定义,例如被调用。如果g++为未使用的未定义函数发出错误,那么它将出错。

A1:所以不可能(以一致的方式)强迫这是一个错误。

编写单元测试。如果一个函数不存在,那么测试它的代码就会失败。

如果只声明一个函数,就无法在单个编译单元中(在编译时)获得错误。因为该函数可以在不同的编译单元中定义。

您可以(假设编译器中启用了插件的Linux系统)编写一个GCC插件,或者更好的是,编写一个MELT扩展(MELT是一种扩展GCC的高级域特定语言),例如,它将为每个声明的函数生成一个指针数组(因此,如果未定义函数,则在链接时会出现错误)。您还可以制作一个MELT扩展,对每个未定义但已声明的函数发出警告。

此外,有时也有充分的理由声明但不定义函数,例如,当它应该由插件、其他对象或库提供时。

此外,头文件通常声明函数,但不定义它们。这些函数通常在链接时由库提供。

您可以使链接器为未引用、未定义的成员函数生成错误,方法是使它们成为虚拟的。显然,这还有其他含义,所以我建议使用预处理器。类似于:

#ifdef TEST_COMPLETE_INTERFACE
#define REQUIRE_DEF virtual
#else
#define REQUIRE_DEF
#endif

class myClass
{
public:
    REQUIRE_DEF void someMethod();
};

您可以定期检查是否所有构建都定义了TEST_COMPLETE_INTERFACE。这不适用于静态方法或自由函数。

有一个GCC特定的属性:

void f() __attribute__((error("not implemented")));
int main() {
    f();
}

提供

error: call to 'f' declared with attribute error: not implemented

该属性也可以用于类方法。至少从GCC 4.4开始支持。

最新更新