6.3运行预处理器
有时可能需要在某些源文件上运行预处理器。通常这是个坏主意,正如您通常需要的那样编译您的项目,而不仅仅是在其上运行预处理器;所以你当然要运行编译器,而不是预处理器。抵抗走最容易的路的诱惑。
然而,如果需要运行预处理器,则使用AC_PREPROC_IFELSE公司
.
本节中描述的宏不能用于Erlang中的测试,Fortran或Go,因为这些语言不需要预处理器。
- 宏:AC_PREPROC_IFELSE公司 (输入,[如果为true,则执行操作],[操作-if-false])¶
-
运行当前语言的预处理器(请参见语言选择)上输入,运行shell命令行动-如果是真的在成功,操作-if-false否则。
如果输入非空使用等效于AC_范围_测试(输入)
生成当前测试源文件;否则,重用已经存在的测试源文件。这个输入可以由AC_范围_程序
和朋友。这个输入文本被展开为未引用的here文档,因此‘$’, ‘`“还有一些”\的应该是反斜杠。请参见此处-文档.
此宏使用CPPFLAGS公司
,但不是CFLAGS公司
,因为-克,-O(运行)等不是许多C语言的有效选项预处理器。
通常报告意外故障AC_MSG_故障
。如果需要,行动-如果是真的可以进一步访问文件中的预处理输出conftest公司。我.
例如:
AC_INIT([你好],[1.0][bug-hello@example.org])AC_DEFINE([HELLO_WORLD],[“你好,世界”],[问候语字符串。])AC_PREPROC_IFELSE公司([AC_LANG_PROGRAM([[const char hw[]=“你好,世界”;]],[[fputs(硬件,标准输出);]])],[AC_MSG_RESULT([OK])],[AC_MSG_FAILURE([意外的预处理器故障])]
可能导致:
正在检查gcc。。。海湾合作委员会正在检查C编译器是否工作。。。对正在检查C编译器默认输出文件名。。。a.输出正在检查可执行文件的后缀。。。检查我们是否正在交叉编译。。。不正在检查对象文件的后缀。。。o(o)检查编译器是否支持GNU C…是检查gcc是否接受-g…yes正在检查gcc选项以启用C11功能-标准=gnu11正在检查如何运行C预处理器。。。gcc-std=gnu11-E好 啊
宏AC_TRY_CPP公司
(请参见过时的宏)用于播放的作用AC_PREPROC_IFELSE公司
,但双引号的论点,使不可能用它来详细说明来源。我们鼓励您摆脱对宏的旧用法AC_TRY_CPP程序
赞成AC_PREPROC_IFELSE公司
,但是,首先,你确定你需要运行预处理器而不是编译器?
-
图案,就像在双引号的壳串中一样展开后,是一个扩展正则表达式。如果在系统头文件上运行预处理器的输出头文件包含匹配的行图案,执行shell命令已找到操作if,否则执行非基金行动.
有关此宏的一些问题,请参见下文。
- 宏:AC_EGREP_CPP公司 (图案,程序,[已找到操作if],[非基金行动])¶
-
图案在像在双引号外壳字符串中一样被扩展之后,是一个扩展正则表达式。程序是C或C++程序的文本,展开为此处未引用的文档(参见此处-文档). 如果在上运行预处理器的输出程序包含一行匹配图案,执行shell命令已找到操作if,否则执行非基金行动.
有关此宏的一些问题,请参见下文。
AC_EGREP_CPP公司
和AC_EGREP_标题
应小心使用,因为预处理器可以在输出标记之间插入换行符。对于例如,预处理器可能会对此进行转换:
#定义主要2#定义MINOR 23版本MAJOR。次要
变成这样:
因为预处理器可以插入空白,所以更改转义在字符串常量中,插入反斜杠-换行对,或执行任意数字对于那些不会改变预处理程序含义的东西最好依靠AC_PREPROC_IFELSE公司
而不是诉诸AC_EGREP_CPP公司
或AC_EGREP_标题
.
有关可移植扩展正则表达式中可以显示的内容的更多信息表达式,请参见有问题的表达在里面GNU希腊.