#include заголовок с объявлениями C в файле сборки без ошибок? - PullRequest
7 голосов
/ 08 февраля 2011

У меня есть файл сборки (asm.S), которому требуется постоянная #define 'd в файле заголовка C (c_decls.h).Заголовочный файл содержит объявления функций C в дополнение к #define, который я хочу.К сожалению, gcc barfs при попытке скомпилировать файл сборки.Например,

c_decls.h

#ifndef __c_decls_h__
#define __c_decls_h__

#define I_NEED_THIS 0xBEEF
int foo(int bar);

#endif

asm.S

#include "c_decls.h"

.globl main
main:
    pushl %ebp
    movl %esp, %ebp
    movl $I_NEED_THIS, %eax
    leave
    ret

Выход

> gcc -m32 asm.S
c_decls.h: Сообщения ассемблера:
c_decls.h: 6: Ошибка: нежелательная '(int bar)' после выражения
c_decls.h: 6: Ошибка: суффикс или операнды недопустимы для 'int'

Есть ли способ #include заголовочный файл C, который содержит объявления функций в файле сборки?(Изменение заголовка или перемещение / переопределение #define не вариант.)

Ответы [ 2 ]

11 голосов
/ 08 февраля 2011

Используйте параметр -dM для cpp, чтобы получить только #defines из ваших заголовочных файлов и вместо этого включить этот файл.

cpp -dM c_decls.h > bare_c_decls.h

Теперь включите bare_c_decls.h в ваш файл .S. И если вы не можете изменить #include в файле .S, сгенерируйте пустые заголовочные файлы в другом каталоге и поместите этот путь для включения в командную строку компилятора / ассемблера, прежде всего.

И, наконец, вы можете обернуть все это в make-файл, чтобы ваши "голые" заголовочные файлы генерировались автоматически.

7 голосов
/ 26 февраля 2013

Это просто: в вашем .S-файле используйте

#define __ASSEMBLY__

В вашем .C-файле используйте

#undef __ASSEMBLY__

Тогда в .h файле поместите условие

       #ifdef __ASSEMBLY__
                  // here declarations only for assembler
       #else
                  // here only for C
       #endif
                  // and here - defines suitable for both
...