Если я использую Clang 3.8.1 для компиляции:
extern "C" {
int foo(int x) { register int y = x; return y; }
}
int main() { return foo(123); }
Я получаю предупреждение:
a.cpp:3:18: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register]
int foo(int x) { register int y = x; return y; }
^~~~~~~~~
… который я действительно не должен был получить, так как внутренняя функция — это C-код. Если я использую GCC 6.3.1, даже с -Wall
Я не получаю это предупреждение.
Это ошибка лягушки или я что-то не так делаю?
extern "C"
не означает «скомпилировать этот код как C». Это означает «сделать эту функцию (или функции) вызываемой из кода C», что обычно означает изменение искажения имени и, иногда, соглашения о вызовах.
Возможно, ошибка не имеет ничего общего с extern "C"
? Похоже, он говорит: «регистр несовместим с C», а «регистр несовместим с C ++ 1z». (Я предполагаю, что C ++ 1x означает C ++ 11/14/17.)