我正在寻找一种方法,将#undef
插入lex生成的源代码中,该源代码将在lex生成的内置行之前出现。
用lex编译file.l时,我生成一个lex.yy.c
文件。在我的file.l
中,我写了:
#include "y.tab.h"
#undef __STRICT_ANSI__
#include <string.h>
#undef
帮助我编译标记为-std=c99
下的代码,因此需要在包含string.h
之前完成。但是在复制我的undef之前,生成的文件包含string.h
。
在没有#undef
的情况下,由于使用strdup
我收到很多警告。我已经看到了使用标志的常规修复程序,但是就像我说的那样,我无法访问Makefile。
“手动”添加行
#undef __STRICT_ANSI__
先修复lex.yy.c。但是我不希望触摸任何生成的代码,而要由lex完成。
我已经读过了, strdup(): Confused about warnings ('implicit declaration', 'makes pointer...without a cast', memory leak) 就像我说的那样,它确实可以解决它。 但是,只有在我能以某种方式强制生成的文件首先运行undef时。
答案 0 :(得分:2)
首先,#undef __STRICT_ASCII__
不是启用strdup
之类的Posix函数声明的正确方法。
在标准C库头文件中声明的Posix扩展名以“功能测试宏”为条件。您可以在man feature_test_macros
中阅读摘要,但是在任何情况下,需要功能测试宏的任何功能的文档都包含对所需宏的描述。对于strdup
,我们可以阅读man strdup
:
glibc的功能测试宏要求(请参见feature_test_macros(7)):
strdup():
_XOPEN_SOURCE >= 500
(随后有更多可能性。)
我个人一直使用
#define _XOPEN_SOURCE 700
请求最新版本Posix中所有功能的声明。
这些都不对您有帮助,因为Flex扫描仪生成器不提供任何允许您在生成的标准库包括之前插入代码的功能。因此,在任何包含标准库函数之前插入功能测试宏的最简单方法是在编译命令行上进行:
-D_XOPEN_SOURCE=700
通常,makefile文件包含一项功能,该功能使您可以在不修改文件的情况下将此选项添加到编译器标志中。例如,以下通常会起作用:
make file CPPFLAGS="-D_XOPEN_SOURCE=700"
({CPPFLAGS
是用于设置预处理器标志的通用makefile变量。)
如果没有其他效果,则始终可以将strdup
的声明(也取自man strdup
)插入flex序言中。
%{
char *strdup(const char *s);
#include "y.tab.h"
%}
C标准和Posix标准都允许显式声明库函数(而不是宏),以作为包括相关标头的替代方法。