Доступ к структуре через указатель в C и C ++ - PullRequest
2 голосов
/ 03 июля 2019

Простой вопрос, поставленный кратко:

Почему именно

JNIEnv *g_env = NULL;
(*g_env)->ExceptionDescribe(g_env);

компилируется в gcc (C)

, но не в g ++ (C ++)

error: base operand of ‘->’ has non-pointer type ‘JNIEnv’ {aka ‘JNIEnv_’}

Поскольку я работаю в основном с C ++, я не понимаю, почему он должен компилироваться.Как указано в ошибке, разыменование указателя приведет к появлению «переменной», а не указателя.То есть: в C ++ это будет либо

g_env->ExceptionDescribe

, либо

(*g_env).ExceptionDescribe

, а не JNIEnv **

1 Ответ

7 голосов
/ 03 июля 2019

Это потому, что код вашей библиотеки другой.

В C * JNIEnv - это тип указателя:

typedef const struct JNINativeInterface *JNIEnv;

В C ++ JNIEnv - это структура:

struct _JNIEnv;
typedef _JNIEnv JNIEnv;

Так что, конечно, он будет компилироваться в одном случае, а не в другом.

Источник

...