当前位置:嗨网首页>书籍在线阅读

20-#pragma

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

16.6.6  #pragma

在现在的编译器中,可以通过命令行参数或IDE菜单修改编译器的一些设置。 #pragma 把编译器指令放入源代码中。例如,在开发C99时,标准被称为C9X,可以使用下面的编译指示(pragma)让编译器支持C9X:

#pragma c9x on

一般而言,编译器都有自己的编译指示集。例如,编译指示可能用于控制分配给自动变量的内存量,或者设置错误检查的严格程度,或者启用非标准语言特性等。C99标准提供了3个标准编译指示,但是超出了本书讨论的范围。

C99还提供 _Pragma 预处理器运算符,该运算符把字符串转换成普通的编译指示。例如:

_Pragma("nonstandardtreatmenttypeB on")

等价于下面的指令:

#pragma nonstandardtreatmenttypeB on

由于该运算符不使用 # 符号,所以可以把它作为宏展开的一部分:

#define PRAGMA(X) _Pragma(#X)
#define LIMRG(X) PRAGMA(STDC CX_LIMITED_RANGE X)

然后,可以使用类似下面的代码:

LIMRG ( ON )

顺带一提,下面的定义看上去没问题,但实际上无法正常运行:

#define LIMRG(X) _Pragma(STDC CX_LIMITED_RANGE #X)

问题在于这行代码依赖字符串的串联功能,而预处理过程完成之后才会串联字符串。

_Pragma 运算符完成“解字符串”(destringizing)的工作,即把字符串中的转义序列转换成它所代表的字符。因此,

_Pragma("use_bool \"true \"false")

变成了:

#pragma use_bool "true "false