Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在标记内使用定义的常量_C++_C_C Preprocessor - Fatal编程技术网

C++ 在标记内使用定义的常量

C++ 在标记内使用定义的常量,c++,c,c-preprocessor,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_adj

我有一个功能列表:

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 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\u某些东西
未被识别为对
JNIFUNC
的引用


我可以完成我想要的吗?

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

C++解决方案是命名空间:

namespace Java_weber_droidtilla_DTActivity{
    void staticInit(...);
}
对于c,您可以这样做(也可以在c++中使用):


预处理器指令查找令牌
JNIFUNC
。令牌
JNIFUNC_staticInit
是一个完全不同的令牌,即使它包含相同的子字符串。您可以为诸如
JNIFUNC staticInit
之类的函数放置空格而不是下划线,这将使预处理器替换令牌,但结果将是
Java\u weber\u droidtila\u DTActivity staticInit
(请注意空格),这很可能导致语法错误

C++解决方案是命名空间:

namespace Java_weber_droidtilla_DTActivity{
    void staticInit(...);
}
对于c,您可以这样做(也可以在c++中使用):


C预处理器是一个简单的文本替换工具,但是要替换的文本必须是一个完整的单词(在C符号的意义上)。当宏
JNIFUNC
是(例如,
JNIFUNC\u gc
的一部分时,将无法识别它

您可以使用宏的标记粘贴语法
##
,来创建新符号。在您的情况下,您可以定义:

#define JNIFUNC(name) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name 

JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);
JNIFUNC(gc)(JNIEnv* env, jobject obj);
JNIFUNC(adjustExternalMemory)(JNIEnv* env, jobject obj, jint bytes);
或者,如果您愿意进一步利用复制模式,可以使用可变宏参数来消除第一对括号:

#define JNIFUNC(name, ...) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name(JNIEnv *env, \
    __VA_ARGS__)

JNIFUNC(staticInit, jclass clazz);
JNIFUNC(gc, jobject obj);
JNIFUNC(adjustExternalMemory, jobject obj, jint bytes);

C预处理器是一个简单的文本替换工具,但是要替换的文本必须是一个完整的单词(在C符号的意义上)。当宏
JNIFUNC
是(例如,
JNIFUNC\u gc
的一部分时,将无法识别它

您可以使用宏的标记粘贴语法
##
,来创建新符号。在您的情况下,您可以定义:

#define JNIFUNC(name) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name 

JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);
JNIFUNC(gc)(JNIEnv* env, jobject obj);
JNIFUNC(adjustExternalMemory)(JNIEnv* env, jobject obj, jint bytes);
或者,如果您愿意进一步利用复制模式,可以使用可变宏参数来消除第一对括号:

#define JNIFUNC(name, ...) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name(JNIEnv *env, \
    __VA_ARGS__)

JNIFUNC(staticInit, jclass clazz);
JNIFUNC(gc, jobject obj);
JNIFUNC(adjustExternalMemory, jobject obj, jint bytes);

你使用C++还是C?查找令牌粘贴。您需要定义一个函数样式宏来使用它。您使用C++还是C?查找令牌粘贴。您需要定义一个函数样式的宏来使用它。不幸的是,名称空间无法工作,因为JNI需要这种精确的函数命名方案。不过,将函数名设为参数是可行的。不幸的是,名称空间不起作用,因为JNI要求使用这种确切的函数命名方案。不过,将函数名作为参数是可行的。