Как изменить #include на #define в c? - PullRequest
0 голосов
/ 05 мая 2020

Есть ли способ изменить синтаксис #include? Вот пример того, как я пытаюсь связаться с этим.

#define begin {
#define end }
#define import #include
import <stdio.h>


int main() begin
 return 0;
end

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Не совсем. По крайней мере, не так, чтобы наполнять какой-либо практический смысл.

Сначала запускается препроцессор, и он пока не изменит "import" на "#include", а затем он выдает результат компилятору. Но компилятор не понимает директив препроцессора. Кроме того, язык C не имеет функции для включения файлов. Предполагается, что этим занимается препроцессор.

Итак, одна вещь, которую МОЖНО сделать, хотя это не то, что вам когда-либо следует делать в производственном коде, - это запустить препроцессор дважды. Весьма вероятно, что этот подход приведет к ошибкам, которые сложно найти.

$ cat a.c
#define begin {
#define end }
#define import #include 
import <stdio.h>
int main() begin
 return 0;
end

$ gcc -E a.c > b.c
$ cat b.c 
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "a.c"



#include <stdio.h>
int main() {
 return 0;
}

$ gcc b.c
$

Вы можете упростить приведенное выше до одной команды следующим образом:

gcc -E a.c | gcc -xc -

(Последний da sh важно)

0 голосов
/ 05 мая 2020

Per C 2018 6.10.3.4 3, после замены макроса:

Полученная в результате полностью замененная макросом последовательность токенов предварительной обработки не обрабатывается как директива предварительной обработки, даже если она похожа на ,…

Таким образом, определение макроса для расширения до #include не приведет к обработке директивы #include.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...