c++ - 在 token 中使用定义的常量

标签 c++ c c-preprocessor

我有一个函数列表:

JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_staticInit(JNIEnv* env, jclass clazz);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_gc(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_init(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

我试图通过使用 define 来摆脱一些重复:

#define JNIFUNC JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity
JNIFUNC_staticInit(JNIEnv* env, jclass clazz);
JNIFUNC_gc(JNIEnv* env, jobject obj);
JNIFUNC_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIFUNC_init(JNIEnv* env, jobject obj);
JNIFUNC_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIFUNC_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIFUNC_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

但是,这不会产生所需的输出,大概是因为 JNIFUNC_something 未被识别为对 JNIFUNC 的引用。

我能完成我想要的吗?

最佳答案

您的预处理器指令查找标记 JNIFUNC。标记 JNIFUNC_staticInit 是一个完全不同的标记,即使它包含相同的子字符串。您可以为您的函数放置一个空格而不是下划线,例如 JNIFUNC staticInit 这将使预处理器替换 token ,但结果将是 Java_weber_droidtilla_DTActivity staticInit(注意空格)很可能会导致语法错误。

c++的解决方案是命名空间:

namespace Java_weber_droidtilla_DTActivity{
    void staticInit(...);
}

对于 c 你可以做这样的事情(也适用于 c++):

#define JNIFUNC(X) JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_##X
JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);

关于c++ - 在 token 中使用定义的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021195/

相关文章:

c++ - 父类(super class)是否可以有子类对象? C++

c - c 中的主要函数 - 程序终止成功或失败

c - C for Windows 32 控制台应用程序中的计时器事件

c - 如何在编译时在 gcc 中显示 #define 的值

c - 如何在 c 中关闭 #elif 语句?

c++ - 使用 C++ xerces 库时出现异常 "node is used in a different document than the one that created it"

c++ - 在 C++ 中使用 Lua

c - 具有执行时间限制的立方体总和

c++ - 使用 C++ 将 XMacro 结构打印到控制台

c++ - 如何安全地检查 C++ 中的类是否已实例化?