我注意到在使用G ++链接项目时,如果有声明但未实现的函数,则没有错误,除非我尝试调用它们。
Q1:如果声明了某个功能但未实现,是否可以启用错误(或至少是警告)?
Q2:为什么会出现这种情况?
(注意:我正在使用G++ 4.7.0
,ld 2.22
如果这是gcc使用的链接器,则来自mingw
包)
答案 0 :(得分:4)
A2:诸如具有外部链接的非内联函数之类的实体在程序中可以具有零个或一个定义。如果实际使用它(严格 odr-used ),则只需要有一个定义 - 例如通过被召唤。如果g ++为未使用的未定义函数发出错误,则会出错。
A1:所以不可能(以一致的方式)强迫这是一个错误。
答案 1 :(得分:2)
如果仅声明函数,则无法在单个编译单元(编译时)中获取错误。因为该函数可以在不同的编译单元中定义。
您可以(假设在编译器中启用了插件的Linux系统)编写GCC插件,或者更好的是MELT扩展名(MELT是扩展GCC的高级域特定语言),例如会创建一个指向每个声明函数的指针数组(因此,如果函数未定义,则在链接时会出现错误)。您还可以创建一个MELT扩展,它会针对每个未定义但声明的函数发出警告。
此外,有时候有充分的理由声明但不能定义一个函数,例如:什么时候应该由插件或其他对象或库提供。
此外,头文件通常声明函数但不定义它们。这些功能通常在链接时由图书馆提供。
答案 2 :(得分:2)
编写单元测试。如果没有函数,则测试它的代码将失败。
答案 3 :(得分:2)
您可以通过将链接器设置为虚拟来使链接器为未引用的,未定义的成员函数生成错误。显然这有其他含义所以我建议使用预处理器。类似的东西:
#ifdef TEST_COMPLETE_INTERFACE
#define REQUIRE_DEF virtual
#else
#define REQUIRE_DEF
#endif
class myClass
{
public:
REQUIRE_DEF void someMethod();
};
您可以定期检查所有内容是否已定义TEST_COMPLETE_INTERFACE
。这不适用于静态方法或自由函数。
答案 4 :(得分:-1)
有一个GCC特定属性:
void f() __attribute__((error("not implemented")));
int main() {
f();
}
给出
error: call to 'f' declared with attribute error: not implemented
此属性也可用于类方法。支持至少GCC 4.4。