Я выполняю некоторую обработку исходного кода между предварительной обработкой C и компиляцией C. На данный момент я:
gcc -E file.c > preprocessed_file.c
.
- Делайте больше вещей для
preprocessed_file.c
.
- Продолжить компиляцию с
preprocessed_file.c
.
Если вы попытаетесь скомпилировать preprocessed_file.c
, как если бы это был обычный C (шаг 3), вы получите много следующего:
/usr/include/stdio.h:257: error: redefinition of parameter ‘restrict’
/usr/include/stdio.h:257: error: previous definition of ‘restrict’ was here
/usr/include/stdio.h:258: error: conflicting types for ‘restrict’
/usr/include/stdio.h:258: error: previous definition of ‘restrict’ was here
/usr/include/stdio.h:260: error: conflicting types for ‘restrict’
[...]
И это просто использование #include <stdio.h>
в file.c
. К счастью, есть возможность сообщить GCC, что он работает с кодом C, который уже был предварительно обработан, указав язык, который компилируется как c-cpp-output
(см. -x
на этой странице). Но это не работает. Я просто получаю это:
$ gcc -x c-cpp-output -std=c99 bar.c
i686-apple-darwin9-gcc-4.0.1: language c-cpp-output not recognized
i686-apple-darwin9-gcc-4.0.1: language c-cpp-output not recognized
ld warning: in bar.c, file is not of required architecture
Undefined symbols:
"_main", referenced from:
start in crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
И точно такой же ответ с более новой версией GCC:
$ gcc-mp-4.4 -x c-cpp-output -std=c99 bar.c
[same error stuff comes here]