我有一个工具链,其中生成头文件(通过javac -h
,即Java native 接口(interface)),但函数的实现是手动编写的。当假定的实现函数实际上没有实现 header 声明的函数时(通常是因为 header 函数已更新),获取错误消息将非常有用。
如果 header 函数位于命名空间中,我知道该怎么做:
#pragma once
namespace N
{
void f();
}
#include "header.hpp"
void N::f() { }
// good: compile error when you change the declaration in the header!
如果没有声明(在 header 中),N::f()
定义的函数将无法编译。
但是,生成器不会将内容放入 namespace 中(并且我找不到方法告诉它),因此我尝试了全局 namespace ,但这显然是不允许的:
#pragma once
void f();
#include "header.hpp"
void (::f)() { }
// error (on MSVC)
// warning "extra/explicit qualification on member 'f'" (on Clang/GCC)
我必须支持 MSVC,因此无法抑制警告。
作为最后的手段,因为所有函数都是 extern "C"
,我想我可以将 #include "header.hpp"
包装在 >命名空间
,但这也不起作用。
我没主意了。这难道是无解的吗?
最佳答案
您至少可以通过使用适当的标志来获得 GCC 或 Clang 的警告:
-Wmissing-declarations
用于 GCC-Wmissing-prototypes
用于 Clang
Clang 还提供了 -Wmissing-declarations
但它不做同样的事情。
GCC 还提供了 -Wmissing-prototypes
但不适用于 C++,我不知道为什么。
关于c++ - 有什么方法可以将函数定义标记为外线吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76533650/