Добавление кода для компиляции в lex первым - PullRequest
0 голосов
/ 30 июня 2019

Я ищу способ вставить #undef в исходный код, сгенерированный lex, который появится до того, как встроенные строки сгенерируют lex.

При компиляции file.l с помощью lex, я генерирую файл lex.yy.c. В моем file.l я написал:

#include "y.tab.h"
#undef __STRICT_ANSI__
#include <string.h>

#undef помогает мне скомпилировать код под флагом -std=c99 Так что это нужно сделать перед включением string.h. Но сгенерированный файл включает string.h перед копированием моего undef.

Без #undef Я получаю много предупреждений из-за использования strdup. Я видел нормальные исправления с использованием флагов, но, как я уже сказал, я не могу получить доступ к make-файлу.

Добавление 'вручную' строки

#undef __STRICT_ANSI__

в lex.yy.c, прежде чем все исправит. Но я предпочитаю не трогать какой-либо сгенерированный код и сделать это с помощью lex.

Я прочитал это, strdup (): запутан в предупреждениях («неявное объявление», «делает указатель ... без преобразования», утечка памяти) И, как я сказал, это решает. Но только если я смогу каким-то образом заставить сгенерированный файл сначала запустить undef.

1 Ответ

2 голосов
/ 30 июня 2019

Начнем с того, что #undef __STRICT_ASCII__ является , а не правильным способом включения объявления функций Posix, таких как strdup.

Расширения Posix, которые объявлены в стандартных заголовочных файлах библиотеки Cсделаны условными по "макросам тестирования возможностей".Вы можете прочитать сводку в man feature_test_macros, но в любом случае документация для любой функции, для которой требуется макрос тестирования функций, содержит описание необходимых макросов.В случае strdup мы можем прочитать в man strdup:

Требования к макросу тестирования возможностей для glibc (см. Feature_test_macros (7)):

   strdup():
       _XOPEN_SOURCE >= 500

(Далее следует больше возможностей.)

Лично я всегда использую

#define _XOPEN_SOURCE 700

, который запрашивает объявления для всех функций в последней версии Posix.


Ничто из этого не поможет вам, потому что генератор гибкого сканера не предоставляет никакой функции, которая позволяет вставлять код до того, как сгенерированная стандартная библиотека включает в себя.Следовательно, самый простой способ вставить макрос тестирования функций перед любым включением стандартной библиотечной функции - это сделать это в командной строке компиляции:

-D_XOPEN_SOURCE=700

Обычно, make-файлы включают в себя функцию, которая позволяет вам добавить этоопция для флагов вашего компилятора без изменения файла.Например, часто будет работать следующее:

make file CPPFLAGS="-D_XOPEN_SOURCE=700"

(CPPFLAGS - это общая переменная make-файла, используемая для установки флагов препроцессора.)


Если ничего не работает, вы можетевсегда просто вставляйте объявление для strdup, (также взятое из man strdup) в ваш пролог flex.

%{
  char *strdup(const char *s);
  #include "y.tab.h"
%}

И стандарт C, и стандарт Posix допускают явное объявление библиотечных функций (но не макросов)) в качестве альтернативы включению соответствующих заголовков.

...