ошибка extern C № 2040: ожидается идентификатор

Я все еще пытаюсь скомпилировать консольное приложение C, процедура компиляции все еще не выполняется с ошибкой ниже:

"Main.c", line 51: error #2040: expected an identifier
  extern "C" void TreatReceivedSignal( int NoSignal ) ;
         ^
1 error detected in the compilation of "Main.c".
gmake: *** [Main.o] Error 2

ниже объявления метода extern в коде C:

extern "C" void TreatReceivedSignal( int NoSignal ) ;

Я использую компилятор HP-UX aCC [HP C/aC++ B3910B A.06.26], также я включил флаг компиляции -Ae, чтобы включить поддержку C99. Кажется, что компилятор не может распознать «extern «C»» как зарезервированное слово C, возможно, необходимо установить какой-то другой флаг компиляции. Любая идея, пожалуйста, которая может решить эту проблему? Заранее большое спасибо. С уважением


person jamel    schedule 24.04.2013    source источник
comment
C и C++ не похожи. Не относитесь к ним так, как будто они есть. Учиться одному или учиться другому. Не учите их одновременно. Не пишите код C для того, чтобы его можно было скомпилировать как C++. Есть много причин, почему это плохая идея. Пишите на C или пишите на C++. Если вы хотите связать код C с проектом C++, скомпилируйте код C с помощью компилятора C и используйте компоновщик C++ для связывания объектного кода.   -  person autistic    schedule 24.04.2013


Ответы (1)


Конструкция extern "C" является специфичной для C++ вещью, ее нельзя использовать в C. И компилятор обрабатывает ваш исходный файл как исходный файл C, поскольку он имеет расширение .c.

Чаще всего можно использовать препроцессор, чтобы условно добавить это для компиляции C++:

#ifdef __cplusplus
extern "C" {
#endif

/* Standard C prototypes */

#ifdef __cplusplus
}
#endif
person Some programmer dude    schedule 24.04.2013
comment
насколько я знаю, методы C и C++ можно использовать на обоих языках, используя механизм связывания. - person jamel; 24.04.2013
comment
@jamel Вы можете использовать эту функцию как из C, так и из C ++, это extern "C" вещь, на которую жалуется компилятор. Этой конструкции нет в языке C. - person Some programmer dude; 24.04.2013
comment
да, я не знаю, почему это компилируется, однако я скомпилировал то же приложение с более старой версией aCC! этой версии, возможно, потребуется установить какой-то дополнительный флаг во время компиляции! - person jamel; 24.04.2013
comment
@jamel Компилятор C жалуется, потому что вы используете конструкцию не на языке C. Это так просто. - person Some programmer dude; 24.04.2013
comment
:) Я попытаюсь добавить #ifdef __cplusplus и буду знать, что произойдет, спасибо, чувак - person jamel; 24.04.2013
comment
@ Joachim Pilebirg, это старое приложение, скомпилированное много раз до этого, мы только что обновили наш компилятор C, и у нас есть эта проблема, я просто пытался избежать модификации кода :) - person jamel; 24.04.2013
comment
ну, я добавил #ifdef __cplusplus, ошибка # 2040 исчезла, но возникла какая-то ошибка прекомпилятора PCC-I-02106, идентификатор пользователя используется только тогда, когда SQLCHECK = FULL, идентификатор пользователя игнорируется. Семантическая ошибка в строке 252, столбец 9, файл ToolBoxDb.pcpp: EXECUTE ........1 PCC-S-02345, SQLCHECK=SEMANTICS должен быть задан при использовании встроенных блоков PL/SQL. Надеюсь, это не связано с последнее изменение :) - person jamel; 24.04.2013
comment
@jamel Я знаю, что это уже очень старо и что вы, вероятно, решили последнюю проблему, но я даю комментарий для будущих читателей: это не имеет ничего общего с C или C ++, и все дело во встроенном SQL и препроцессоре. система для обработки этого. Это совершенно отдельная проблема, и поэтому ее следует задать в новом вопросе. - person Some programmer dude; 24.06.2019