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公司,但是,首先,你确定你需要运行预处理器而不是编译器?

宏:AC_EGREP_标题 (图案,头文件,已找到操作if,[非基金行动])

图案,就像在双引号的壳串中一样展开后,是一个扩展正则表达式。如果在系统头文件上运行预处理器的输出头文件包含匹配的行图案,执行shell命令已找到操作if,否则执行非基金行动.

有关此宏的一些问题,请参见下文。

宏:AC_EGREP_CPP公司 (图案,程序,[已找到操作if],[非基金行动])

图案在像在双引号外壳字符串中一样被扩展之后,是一个扩展正则表达式。程序是C或C++程序的文本,展开为此处未引用的文档(参见此处-文档). 如果在上运行预处理器的输出程序包含一行匹配图案,执行shell命令已找到操作if,否则执行非基金行动.

有关此宏的一些问题,请参见下文。

AC_EGREP_CPP公司AC_EGREP_标题应小心使用,因为预处理器可以在输出标记之间插入换行符。对于例如,预处理器可能会对此进行转换:

#定义主要2#定义MINOR 23版本MAJOR。次要

变成这样:

版本2.23

因为预处理器可以插入空白,所以更改转义在字符串常量中,插入反斜杠-换行对,或执行任意数字对于那些不会改变预处理程序含义的东西最好依靠AC_PREPROC_IFELSE公司而不是诉诸AC_EGREP_CPP公司AC_EGREP_标题.

有关可移植扩展正则表达式中可以显示的内容的更多信息表达式,请参见有问题的表达在里面GNU希腊.