2

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

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

Q2:为什么会有这种行为?

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

4

5 回答 5

4

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

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

于 2012-09-05T16:55:37.013 回答
2

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

于 2012-09-05T17:05:48.217 回答
2

如果仅声明函数,则无法在单个编译单元中(在编译时)出现错误。因为该函数可以在不同的编译单元中定义。

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

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

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

于 2012-09-05T16:57:40.773 回答
2

您可以通过将链接器设为虚拟来使链接器为未引用、未定义的成员函数生成错误。显然这有其他含义,所以我建议为此使用预处理器。就像是:

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


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

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

于 2012-09-05T18:23:16.753 回答
-1

有一个 GCC 特定属性:

void f() __attribute__((error("not implemented")));

int main() {
    f();
}

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

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

于 2017-06-01T13:39:40.127 回答