ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

常用的C++预处理

2022-05-09 18:03:41  阅读:167  来源: 互联网

标签:__ 常用 定义 C++ 编译 指令 参数 pragma 预处理


  预处理指令提供按条件跳过源文件中的节、报告错误和警告错误条件,以及描绘源文件代码的不同区域的能力。是整个编译过程的最先做的工作。预处理不做语法检查,预处理命令以符号“#”开头。

宏定义:#define

头文件:#include

条件编译:#if、#elif、#ifndef、#else、#endif、#undef

错误信息指令:#error

#line指令

布局控制:#pragma

 

宏定义——“#”

宏定义简称宏。宏定义只做替换,不做计算,不做表达式求解。宏定义分带参数宏定义和不带参数宏定义。在带参数的宏定义,宏名和参数的括号间不能有空格。

宏定义不分配内存,变量定义分配内存。

宏展开不占运行时间,只占编译时间:函数调用占运行时间(分配内存、保留现场、值传递、返回值)。

出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串,有时把这种用法的#称为字符串化运算符。例如:

#include<iostream>
using namespace std;
#define STR(n) "很好"#n

int main(){
    cout <<STR(10) <<endl;          
}

 

输出:很好10

 

宏定义——“##”

##运算符用于把参数连接到一起,预处理程序把出现在##两侧的参数合并成一个符号。例如:

 

#include <iostream>
using namespace std;

#define STR(a,b,c)  a##b##c

int main(){
    int STR(a,1,2) = 10;
    cout << a12 <<endl;
}

 

输出:10

 

条件编译

使用条件编译可以使目标程序变小,运行时间变短。

#undef指令,用来删除事先定义的宏定义,其一般形式为:#undef宏替换名

 

错误信息指令

 

#error指令,该指令用于程序的调试,输出一个错误信息,当编译中遇到#error指令就停止编译,其一般形式为:#error出错信息。例如:

#ifndef __cplusplus
#error this is not a C++ complier.
#endif
#include <iostream>
using namespace std;

int main(){
   cout << "hh" <<endl;
}

 

#line指令

命令#line改变__LINE__与__FILE__的内容,他么是在编译程序中预先定义的标识符。

其格式为:#line number [filename] ,这条指令可以改变当前的行号和文件名。

#include <iostream>
using namespace std;

#line 100 "a.cpp"

int main()
{
    cout <<__LINE__<<'\t'<<__FILE__<<endl;
}    

 

输出:103          a.cpp

 

布局控制指令#pragma para

message 参数

Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:

#pragma message(“消息文本”)

当人们在程序中定义了许多宏来控制源代码版本的时候,人们自己有可能都会忘记有没有正确的设置这些宏,此时人们可以用这条指令在编译的时候就进行检查。假设人们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法:

#ifdef _X86

#pragma message("_X86 macro activated!")

#endif

#pragma once

只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过基本上已经是每个编译器都有这个定义了。

#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

 

#pragma pack(n)

#pragma pack规定的对齐长度,实际使用的规则是: 结构,联合,或者类的 数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较大的那个进行。 但是,当#pragma pack的值等于或超过最长数据成员的长度的时候,这个值的大小将不产生任何效果。 而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。

搜索

复制

标签:__,常用,定义,C++,编译,指令,参数,pragma,预处理
来源: https://www.cnblogs.com/cuijy1/p/16250165.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有