Почему Clang определяет NULL как __null? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть файл .cpp, который использует NULL в нескольких местах. Когда я пытаюсь скомпилировать этот файл cpp для платформы Android / x86, используя clang ++ на Windows-машине + отдельная цепочка инструментов, я сталкиваюсь с ошибкой «ожидаемое выражение» в местах, где используется NULL . Я нахожу определение NULL в stddef.h заголовков clang, предоставляемых Android NDK, как показано ниже.

#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
#  if !defined(__MINGW32__) && !defined(_MSC_VER)
#    define NULL __null
#  else
#    define NULL 0
#  endif
#else
#  define NULL ((void*)0)
#endif

Насколько я знаю, __null относится к компилятору GNU. В моем случае и _MSC_VER, и __MINGW32__ не определены, потому что я компилирую для платформы Android, используя clang ++ и отдельную цепочку инструментов. Таким образом, он попадает в define NULL __null. Поскольку clang ++ не имеет ни малейшего представления о том, что такое __null, это приводит к ошибке «ожидаемое выражение».

Мой вопрос заключается в том, почему clang использует макросы (например, __null), предоставляемые компилятором GNU? Или я что-то здесь упускаю?

Может кто-нибудь помочь мне понять. Спасибо

1 Ответ

1 голос
/ 04 ноября 2019

Почему Clang определяет NULL как __null?

__null превосходит 0, так как первый является только константой нулевого указателя, а последний также является целочисленной константой,Это различие является значительным в случае разрешения перегрузки и вывода типа:

void foo(int);
void foo(void*);

foo(0);       // calls foo(int)
foo(__null);  // call is ambiguous, program is ill-formed
foo(NULL);    // could have either behaviour
              //  call to foo(int) would be undesirable
foo(nullptr); // calls foo(void*)

Причина та же или похожая, как и то, почему nullptr был введен в язык в C ++ 11.

Другая причина для этого заключается в том, что clang стремится быть тесно совместимым с GCC.

Поскольку clang ++ не имеет ни малейшего представления о том, что такое __null,

clang ++ появляется знать, что такое __null.

...