常用的C++预处理

2022/5/10 11:04:38

本文主要是介绍常用的C++预处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

宏定义:#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++预处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程