| 支持的 Pragma 指令 | ![]() |
![]() |
![]() |
![]() |
该Wave预处理器库原生支持 #pragma once 和 #pragma message("...") 指令。
指令 #pragma once 指定在其所在的文件的 pragma 只会被包含(打开)一次。这可以用来优化大型编译单元的预处理,这些单元包含很多文件。但请注意,#pragma once 指令仅在编译库时定义了编译时常量BOOST_WAVE_SUPPORT_PRAGMA_ONCE时才受支持。
指令 #pragma message(...) 会生成一个包含给定消息文本的备注。这对于直接从预处理后的文件中生成状态消息非常有用。但请注意,#pragma message(...) 指令仅在编译库时定义了编译时常量BOOST_WAVE_SUPPORT_PRAGMA_MESSAGE时才受支持。另外请注意,当编译库时定义了BOOST_WAVE_PREPROCESS_PRAGMA_BODY编译时常量时,消息正文才会被预处理。
Wave 预处理器工具还额外支持特定的 #pragma 指令,这些指令可用于控制工具的某些功能。这些 #pragma 指令是使用interpret_pragma()预处理钩子实现的(请参见 此处)。
此处描述的所有指令都可以用作传统的 #pragma 指令,也可以用作 operator _Pragma(如果启用了变参)。因此,例如以下指令在功能上是等价的
#pragma wave trace(enable)
and
_Pragma("wave trace(enable)")
所有Wave特定 pragma 必须具有通用形式'wave 选项[(值)]',其中'wave'是特定的关键字(可以通过BOOST_WAVE_PRAGMA_KEYWORD编译时常量配置,有关更多信息请参见 此处),'选项'是要触发的具体 pragma 功能,以及'值'是可选项,用于提供给'选项'功能。下表列出了 Wave 库支持的所有可能的 pragma 功能。对于所有识别出的这种通用形式的 pragma,都会调用 preprocessing_hooks 策略中的 interpret_pragma 钩子函数,因此库的用户负责正确解释这些 pragma。Wave支持的 pragma
| 支持的 pragma |
||
| pragma 选项 |
pragma 值 |
描述 |
| trace |
enable/on/1 |
启用或禁用宏展开过程的跟踪。即使提供了 --trace 命令行选项,这仍然是必需的,因为只有在找到至少一个 trace(enable) pragma 时才生成跟踪输出。 |
stop |
消息 |
停止执行Wave并打印出给定消息。这对于直接调试目的非常有用。 |
system |
命令 |
尝试将 'command' 作为新的操作系统命令生成,并截获生成的 stdout 和 stderr。该命令的标准输出(如果有)会被重新标记化,并用作整个 pragma 的替换文本,标准错误输出会被忽略。如果命令的返回值是零,则认为命令成功,否则会报告错误。 |
timer |
restart/0 |
值restart将当前经过的时间设置为 0 并重新启动计时器。 如果未提供值,则当前经过的时间将打印到 std::cerr 流。 值suspendandresume允许临时停止和恢复计时。 |
option |
line: [0 | 1 | push | pop] |
该option(line: ...)指令允许控制是否在输出流中生成 #line 指令。指定 '0' 或 '1' 作为选项参数。所有其他值都将被标记为非法。 该option(preserve: ...)指令允许控制输出流中生成的空白量。值为 '0' 会移除任何不必要的空白,值为 '1' 只保留注释,值为 '2' 则不移除任何空白。 该option(output: ...)指令允许指定输出生成的文件的名称。指定一个有效的文件名(该文件名将相对于处理过的文件的目录进行解释),值为null来完全禁用输出,或者值为default来使用通过 --output/-o 选项在命令行上指定的输出。 pragma 值pushandpop可用于所有选项(行, preserveandoutput)来存储和恢复相应选项的当前值。 |
此处未列出但被标记为'wave'的 pragma 目前都被报告为错误。所有剩余 pragma 的处理取决于编译常量 BOOST_WAVE_RETURN_PRAGMA_DIRECTIVES,它允许指定这些 pragma 是否在输出流中保持不变。请注意,operator _Pragma 变体始终会经过完全预处理,然后 pragma 本身才会被评估。#pragma 变体只有在编译时定义了 BOOST_WAVE_PREPROCESS_PRAGMA_BODY 编译常量时才进行预处理。有关可能的编译常量的更多信息,请参见 此处。
实现自己的 #pragma wave ... 指令非常容易。您需要做的就是实现自己的interpret_pragma预处理钩子函数(请参见 此处),它应该处理额外的指令。有关如何操作的示例,您可以参考 Wave 驱动程序应用程序,该应用程序借助提供的interpret_pragma函数(例如 #pragma wave timer() 指令)实现了上述所有 pragma。
![]() |
![]() |
![]() |
版权所有 © 2003-2011 Hartmut Kaiser
根据 Boost Software License, Version 1.0 分发。(参见附带的 LICENSE_1_0.txt 文件或访问 https://boost.ac.cn/LICENSE_1_0.txt 副本)
最后更新日期2007年1月11日星期四 20:14