2015-06-22 3 views
2

Я пытаюсь разобрать синтаксис файла C с помощью pycparser. Я отправляю файл C через препроцессор, а затем отправляю вывод препроцессора для анализа на pycparser. Следующий код находится в одном из файлов C ...extern, за которым следует строка literal

extern "asm" 
{ 
    extern void ASM_Function(void); 
} 

pycparser бросает и исключение говорит мне, что это не действует синтаксис C. Глядя на C BNF, ключевое слово extern не допускает предшествующего ему строкового литерала. Я правильно читаю BNF? Была ли эта функциональность extern добавлена ​​в более позднюю версию C или это специфический компилятор синтаксиса?

+3

Вы уверены, что это не [код C++] (http://en.cppreference.com/w/cpp/language/language_linkage)? Однако может существовать компилятор C с таким расширением. – cremno

+0

Не соответствует ли ASM код уровня сборки? 'asm volatile (@assembler funtion);'? – DarthSpeedious

+0

@cremno Программа компилятора поддерживает как код C, так и C++, но я указал флаг выполнения только с использованием компилятора C. Это может быть расширение, которое позволяет программисту связывать сборку в –

ответ

0

Это похоже на расширение компилятора. Знаете ли вы, для какого компилятора был изначально написан код?

Большинство компиляторов поддерживают объявляя C соглашения о вызовах, обернув объявление функции с:

#ifdef __cplusplus 
extern "C" { 
#endif 

    // functions that use C calling convention. 
    // are declared here. 

#ifdef __cplusplus 
} /* extern "C" */ 
#endif 

код, как представляется, объявляя внешне определенную функцию сборки под названием ASM_Function. Вы можете переписать это, если знаете, что такое вызывающее соглашение, которое ожидает функция сборки.

extern «C» - это конструктор C++ для объявления функций, которые не будут использовать управление именами и будут использовать соглашение о вызове cdecl.

EDIT: Исправлено сообщение.

+2

'extern« C »- это C++. Заголовочные файлы, используемые с компиляторами C и C++, используют ifdef, например. '#ifdef __cplusplus', чтобы скрыть« extern »C« от компилятора C. – user3386109

+0

Да, это правильно, но заголовки C, которые хотят быть совместимыми с компилятором C++, по-прежнему работают с компиляторами C. Современные компиляторы C знают об этом в своих грамматиках. –

+0

@ManVsCode: дело в том, что препроцессор скрывает «extern» C «', поэтому он даже не виден компилятором C, который плохо сработает с «extern» C ». –

Смежные вопросы