Можно ли сделать так, чтобы cpp не выводил пробел на #pragma? - PullRequest
0 голосов
/ 17 января 2019

Я пишу машину Тьюринга в препроцессоре 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. Есть ли способ их избежать?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы всегда можете передать вывод через фильтр:

gcc -E -P main.c | grep '[^ ]'

grep выделяет все строки, у которых есть символ, который не является пробелом; другими словами, он удаляет все пустые строки и строки, состоящие только из пробелов. С GNU grep вы можете использовать шаблон \S, который также будет игнорировать строки, содержащие только пробелы и символы табуляции.

0 голосов
/ 18 января 2019

Да, вы правы, директива #pragma расширяется до новой строки. Похоже, gcc не имеет параметров для управления этим поведением.

Минимальный пример:

// turing.h
#pragma push_macro("Test")

// main.c
int main() {
#include "turing.h"
}

Вывод:

int main() {

}

Также обратите внимание, что директива #pragma, которую компилятор не может понять, просто расширяется.

...