Я пишу машину Тьюринга в препроцессоре C с #pragma push_macro
и #pragma pop_macro
. Я хочу, чтобы он выводил результат сразу после завершения предварительной обработки, а не выводил программу, предназначенную только для печати, которая все еще должна запускаться для получения результата.
Часть исходного кода:
// main.c
int printf(char*, ...);
int main() {
#define CODEFILE "command.c"
#include "turing.h"
#undef CODEFILE
}
// turing.h
#ifndef PARSE
#define PARSE(x) x
#pragma push_macro("PARSE")
#undef PARSE
#pragma pop_macro("PARSE")
#ifndef PARSE
#error push_macro/pop_macro not supported!
#else
#define GET03(x,y,z) x
#define GET13(x,y,z) y
#define GET23(x,y,z) z
#define GETN(n,l) PARSE(GET##n l)
#define COMMAND GETN(03, MOVE)
#define TNEXT GETN(13, MOVE)
#define FNEXT GETN(23, MOVE)
#define LEFT SPECIAL(1)
#define RIGHT SPECIAL(2)
#define NOP SPECIAL(3)
#define WARN SPECIAL(4)
#define HALT SPECIAL(5)
#define DEPTH 0
#pragma push_macro("DEPTH")
#undef DEPTH
#define DEPTH 1
#endif
#endif
#
#
#ifdef PARSE
#define STATUS 0
#define PTRL 0
#define PTR 0
#
#include "infloop.h"
#
#include "clrmemlp.h"
#
#pragma pop_macro("DEPTH")
#undef FINISHED
#undef STATUS
#undef PTRL
#undef PTR
#
#endif
Выполнение cpp main.c
получит: (некоторые строки содержат пробелы в конце)
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
int printf(char*, ...);
int main() {
# 1 "turing.h" 1
# 22 "turing.h"
# 34 "turing.h"
# 1 "infloop.h" 1
...
Номера строк здесь раздражают. Тогда я вижу в документе --help
:
-P Do not generate #line directives
Используя этот флаг, я могу получить
int printf(char*, ...);
int main() {
printf ("x = %d, ", 1);
...
Однако все еще остается большое количество пустых строк. Кажется, они пришли из #pragma
, и я также проверил:
1
#pragma push_macro("x")
2
#define x 3
3
#undef x
4
#include "nul"
5
и результат
1
2
3
4
5
Так что я почти уверен, что пустые строки взяты из #pragma
. Есть ли способ их избежать?