C++11 __pragma操作符
【1】__pragma 与 #pragma 的区别
在C/C++标准中,#pragma是一条预处理的指令(preprocessor directive)。
简单地说,#pragma是用来向编译器传达语言标准以外的一些信息。
举个常见的例子,如果我们在代码的头文件中定义了以下语句:
#pragma once
那么,该指令会指示编译器(如果编译器支持)该头文件应该只被编译一次。
这与使用如下代码来定义头文件所达到的效果是一样的:
#ifndef THIS_HEADER #define THIS_HEADER //一些头文件的定义 #endif
在C++11中,标准定义了与预处理指令#pragma功能相同的操作符__pragma。
__pragma操作符的格式如下:
__pragma(字符串字面量)
其使用方法跟sizeof等操作符一样,将字符串字面量作为参数写在括号内即可。
那么,要达到与上例#pragma类似的效果,则只需要如下代码即可。
__pragma("once")
而相比预处理指令#pragma,由于__pragma是一个操作符,因此可以用在一些宏中。
为了加深理解,可以再看下面这个例子:
假设编译器支持4个不同程度的优化等级,如果使用#pragma,则这样写:
#pragma OPT_LEVEL n // n的范围[1, 4]
你会不会觉得每次都要重复写“#pragma...”很麻烦?如果可以利用宏定义来简化书写就好了:
#define OPT_L(x) #pragma OPT_LEVEL x
这时我们只须写:
OPT_L(3)
就相当于写:
#pragma OPT_LEVEL 3
可惜.....在C90这里永远是一个梦想!因为字符“#”在预处理指令中有特殊的用途,跟在它后面的必须是宏的参数名,例如:
#define MACRO(x) #x
那么,MACRO(example)的替换结果为:
“example”
于是可以想象,前面通过#define来定义一个关于#pragma的宏是不可行的。
不过,新的关键字“__pragma”就很好的解决了这个问题,由于__pragma并没有字符“#”,所以我们可以放心的定义宏:
#define PRAGMA(X) __pragma(#X) #define OPT_L(X) PRAGMA(OPT_LEVEL X)
这时,我们只要写:
OPT_L(2)
经过预处理后,就成为:
__pragma("OPT_LEVEL 2")
即就是:
#pragma OPT_LEVEL 2
【2】总结
该操作符__pragma 具有 与 #pragma指令相同的功能。不同之处在于:
__pragma操作符在宏定义中是以内联方式使用的。
#pragma指令不可用于宏定义中,因为编译器会将指令中的数字符号("#")解释为字符串化运算符(#)。
Good Good Study,Day Day Up.
顺序 选择 循环 总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2013-01-19 桶排序