如何确保 C++ 函数在定义之前被声明(如 override 关键字)?
How to ensure a C++ function is declared before being defined (like the override keyword)?
在我的共享库中,我在头文件中声明了一个函数,并在 .cpp 源文件中定义了它。当 link 使用该库运行应用程序时,link 用户抱怨该函数未定义,我不知道是因为缺少命名空间、不同的参数还是其他原因。
如果我可以将函数定义标记为“实现先前的声明”,我会在编译期间捕捉到这个 declaration/definition 差异,而不是稍后我 link 带有库的应用程序时。
是否有类似于 class 方法的“override”关键字的东西会阻止我在没有现有匹配声明的情况下定义函数?
我可以使用 -Wl,--no-undefined
但有些库是在预期 --no-undefined
不会被使用的情况下创建的。
在命名空间的头文件中声明一个函数,例如:
namespace N { void f(); }
在 .cc
文件中定义 函数
void N::f() { /*...*/ }
这样,如果命名空间 N
中的 f
声明与定义不匹配,则会发出编译器错误。
对于某些编译器,Maxim Egorushkin 的另一个答案可以简化如下:
在头文件中正常声明函数:
void f();
使用未命名命名空间的限定名称定义函数:
void ::f() { /* ... */ }
显然你也可以将它放在一个命名空间中。
在我的共享库中,我在头文件中声明了一个函数,并在 .cpp 源文件中定义了它。当 link 使用该库运行应用程序时,link 用户抱怨该函数未定义,我不知道是因为缺少命名空间、不同的参数还是其他原因。
如果我可以将函数定义标记为“实现先前的声明”,我会在编译期间捕捉到这个 declaration/definition 差异,而不是稍后我 link 带有库的应用程序时。
是否有类似于 class 方法的“override”关键字的东西会阻止我在没有现有匹配声明的情况下定义函数?
我可以使用 -Wl,--no-undefined
但有些库是在预期 --no-undefined
不会被使用的情况下创建的。
在命名空间的头文件中声明一个函数,例如:
namespace N { void f(); }
在 .cc
文件中定义 函数
void N::f() { /*...*/ }
这样,如果命名空间 N
中的 f
声明与定义不匹配,则会发出编译器错误。
对于某些编译器,Maxim Egorushkin 的另一个答案可以简化如下:
在头文件中正常声明函数:
void f();
使用未命名命名空间的限定名称定义函数:
void ::f() { /* ... */ }
显然你也可以将它放在一个命名空间中。