【问题标题】:How to ensure a C++ function is declared before being defined (like the override keyword)?如何确保在定义之前声明 C++ 函数(如 override 关键字)?
【发布时间】:2020-07-15 11:19:04
【问题描述】:

在我的共享库中,我在头文件中声明了一个函数,并在 .cpp 源文件中定义了它。将应用程序与库链接时,链接器抱怨该函数未定义,我不知道是因为缺少命名空间、不同的参数还是其他原因。

如果我可以将函数定义标记为“实现先前的声明”,我会在编译期间发现这个声明/定义的差异,而不是稍后在我将应用程序与库链接时。

是否有类似于类方法的“override”关键字的东西会阻止我在没有现有匹配声明的情况下定义函数?

我可以使用-Wl,--no-undefined,但是创建了一些库,期望--no-undefined 不会被使用。

【问题讨论】:

标签: c++ shared-libraries


【解决方案1】:

在命名空间的头文件中声明一个函数,例如:

namespace N { void f(); }

使用qualified function name.cc 文件中定义函数:

void N::f() { /*...*/ }

这样,如果命名空间N 中没有f 的声明与定义匹配,则会发出编译器错误。

【讨论】:

    【解决方案2】:

    Maxim Egorushkin 的另一个答案对于某些编译器可以简化如下:

    在头文件中正常声明函数:

    void f();
    

    使用未命名命名空间的限定名称定义函数:

    void ::f() { /* ... */ }
    

    显然你也可以将它放在命名空间中。

    【讨论】:

    • 不能像你那样简化:error: explicit qualification in declaration of ‘void f()’.
    • 适用于 Visual Studio 2017、clang 3.1、3.5...10.0。在 gcc 中不起作用。
    • 这似乎在 2006 年变为合法。open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#482 但我不是 C++ 语言律师。
    • clang 产生warning: extra qualification on member 'f' [-Wextra-qualification]。我不明白为什么这不应该按预期工作,但这就是今天的情况,这就是我在回答中没有提到它的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多