【问题标题】:C++ Preprocessor Infix Stingified Macro Function ValueC++ 预处理器中缀 Stingified 宏函数值
【发布时间】:2015-10-08 10:23:01
【问题描述】:

我正在开发一个基于 JNI 的大型项目。 JNI 需要某些 C 函数名来匹配相关的 JAVA 函数名。我在说什么的例子:

Example.java

package com.example.app;
...
class Example {
    public static native void doSomething();
}

Example.c

JNIEXPORT void JNICALL Java_com_example_app_Example_doSomething(...) {...}

我正在使用宏来简化符号:

#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(..., __VA_ARGS)

但是当我尝试用另一个宏返回值替换宏中的..com_example_app... 部分时遇到了问题:

#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE("_")##_##name(..., __VA_ARGS)

有没有正确模拟我写的语法?它似乎不起作用。

附:我也在代码的其他部分使用 J_PACKAGE 宏,只是使用了不同的分隔符。

示例 1

#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(JNIEnv* env, jobject obj, __VA_ARGS__)

J_DEF(myFunction); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);
J_DEF(myFunction, int x); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj, int x);

示例 2

#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE(_)##_##name(JNIEnv* env, jobject obj, __VA_ARGS__)

J_DEF(myFunction); // generates: void  Java_J_PACKAGE(_)_myFunc(JNIEnv* env, jobject obj  );
// instead I need to generate JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);

【问题讨论】:

  • “它似乎不起作用”是什么意思?你能给出一个示例输入,你期望的输出和你实际得到的输出吗?
  • 您似乎使用字符串常量作为方法名称。在 J_PACKAGE 中使用 ## 并删除 "
  • 我已经用具体例子更新了这个问题。

标签: c++ macros c-preprocessor


【解决方案1】:

我认为这将解决您的问题:

#define J_PACKAGE(sep) com ## sep ## example ##  sep ##  app
#define JDEF2(A, B) JNIEXPORT void JNICALL java_##A##_##B
#define JDEF1(A, B)  JDEF2( A, B)
#define J_DEF(C, ...) JDEF1( J_PACKAGE(_), C) (JNIEnv* env, jobject obj, __VA_ARGS__)

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2014-04-13
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多