支持的 Pragma 指令

Wave 库支持的 Pragma 指令
Wave 工具支持的 Pragma 指令

Wave 库支持的 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 指令

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
disable/off/0

启用或禁用宏展开过程的跟踪。即使提供了 --trace 命令行选项,这仍然是必需的,因为只有在找到至少一个 trace(enable) pragma 时才生成跟踪输出。

stop

消息

停止执行Wave并打印出给定消息。这对于直接调试目的非常有用。

system

命令

尝试将 'command' 作为新的操作系统命令生成,并截获生成的 stdout 和 stderr。该命令的标准输出(如果有)会被重新标记化,并用作整个 pragma 的替换文本,标准错误输出会被忽略。如果命令的返回值是零,则认为命令成功,否则会报告错误。
#pragma 仅在指定了 -x 命令行选项时可用。如果未指定此命令行参数并遇到 #pragma wave system() 指令,则Wavedriver 会发出一个备注

timer

restart/0
<无值>
suspend
resume

restart将当前经过的时间设置为 0 并重新启动计时器。

如果未提供值,则当前经过的时间将打印到 std::cerr 流。

suspendandresume允许临时停止和恢复计时。

option

line: [0 | 1 | push | pop]
preserve: [0 | 1 | 2 | push | pop]
output: ["filename" | null | default | 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。