Bizdelnick писал: ↑17.10.2022 14:54
Вы опять излагаете свои домыслы вместо реальной проблемы. Рассказывайте, чем это якобы мешает.
Странно. Я считал, что мы друг другу доверяем.
...Итак, посмотрим, как
gcc указывает на ошибки, в файле
*.c, созданым
flex. Для этого маленькую ошибку создадим специально. Конфигурационный файл
flex. В нём написана чушь, чтобы только воспроизвелась ошибка:
Shell
$ cat exampleA.l
%%
W: Q
%%
$
Теперь создадим файл на языке Cи:
Shell
$ flex exampleA.l
$
$ ls
exampleA.l lex.yy.c
$
То есть видим, что получился файл
lex.yy.c, скомпилим его. А функция
main(), нужно вам сказать уже где-то в библиотеке
libfl.a есть. Нужно эту библиотеку добавить:
Shell
$ gcc -o exampleA lex.yy.c -lfl
exampleA.l: In function ‘yylex’:
exampleA.l:2:1: error: ‘Q’ undeclared (first use in this function)
2 | W: Q
| ^
exampleA.l:2:1: note: each undeclared identifier is reported only once for each function it appears in
exampleA.l:2:2: error: expected ‘;’ before ‘break’
2 | W: Q
| ^
| ;
$
Вот такая выходит ошибка, но вопрос- а она где проявляется? А она проявляется в файле
exampleA.l в функции
yylex (). Несмешные шутки какие-то,
exampleA.l что, заголовочный файл какой-то или что? Он конфигурационный файл для
flex. Хорошо, удалим
exampleA.l. (чтобы не было
непоняток, изначально он был, но я его руками удалил и теперь его нет. Но могу восстановить.)
Shell
$ rm exampleA.l
$ ls
lex.yy.c
$ gcc -o exampleA lex.yy.c -lfl
exampleA.l: In function ‘yylex’:
exampleA.l:2:1: error: ‘Q’ undeclared (first use in this function)
exampleA.l:2:1: note: each undeclared identifier is reported only once for each function it appears in
exampleA.l:2:2: error: expected ‘;’ before ‘break’
$
То есть оно упорно лезет в файл
exampleA.l, которого уже нет и в нём умудряется найти функцию
yylex(), которой, соответственно, тоже нет и в ней найти ошибку. Что ж такое? А я вот выяснил, что именно так будет себя
gcc, обрабатывая файл с расширением
*.i, и не просто с расширением, а именно созданный как
*.i, то есть
gcc с опцией
-E
Вот собсно и всё. Зачем
gcc лезет в несуществующий файл
exampleA.l и как этого избежать.
Я просто читаю маны.