c++ - 有什么方法可以将函数定义标记为外线吗?

标签 c++ java-native-interface

我有一个工具链,其中生成头文件(通过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++,我不知道为什么。

See also this question.

关于c++ - 有什么方法可以将函数定义标记为外线吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76533650/

相关文章:

java - float 从 jni 返回到 java 收到错误结果

c++ - OpenCV VideoCapture::set iOS 不工作

Android - OpenSL ES 高麦克风增益

c++ - 用c++编写一个简单的linux桌面环境

c++ - QListWidget 通过 setItemWidget 拖放自定义小部件集

gcc - 如何知道ndk-build的gcc优化级别

java - jni- 释放对象数组

android - 我可以从我的 apk 中删除哪个 libopencv_java3.so?

C++ 负平方根

c++ - 访问冲突新的 C++ 结构