Начнем с того, что #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 допускают явное объявление библиотечных функций (но не макросов)) в качестве альтернативы включению соответствующих заголовков.