Защита #include
s от расширения, текстовый запуск препроцессора, удаление # 1 "<stdint>"
и т. Д., Которые генерирует текстовый препроцессор, и повторное предоставление защищенных #include
s.
Эта функция оболочки делает это:
expand_cpp(){
sed 's|^\([ \t]*#[ \t]*include\)|magic_fjdsa9f8j932j9\1|' "$@" \
| cpp | sed 's|^magic_fjdsa9f8j932j9||; /^# [0-9]/d'
}
до тех пор, пока вы держите слово включения вместе, вместо того, чтобы делать сумасшедшие вещи вроде
#i\
ncl\
u??/
de <iostream>
(выше вы можете видеть 2 строки продолжения с обратной косой чертой + 1 триграф (?? /== \) строка продолжения с обратной косой чертой).
При желании вы можете защитить #if
s #ifdef
s #ifndef
s #endif
s и #else
s таким же образом.
Применительно к вашему примеру
example.c:
#include <stdio.h>
#define prn(s) printf("this is a macro for printing a string: %s\n", s);
int int(){
char str[5] = "test";
prn(str);
return 0;
}
, как с expand_cpp < example.c
или expand_cpp example.c
, генерирует:
#include <stdio.h>
int int(){
char str[5] = "test";
printf("this is a macro for printing a string: %s\n", str);;
return 0;
}