当前位置: 首页 > 编程笔记 >

常用C/C++预处理指令详解

曾华翰
2023-03-14
本文向大家介绍常用C/C++预处理指令详解,包括了常用C/C++预处理指令详解的使用技巧和注意事项,需要的朋友参考一下

  预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。预处理命令以符号“#”开头。

  常用的预处理指令包括:

宏定义:#define
文件包含:#include
条件编译:#if、#elif、#ifndef、#ifdef、#endif、#undef
错误信息指令:#error
#line指令
布局控制:#pragma

宏定义

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

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

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

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


#include<iostream>

using namespace std;

#define STR(n)"abcd"#n

int main() {     cout<<STR(6)<<endl;     system("pause");     return 0; }

  输出结果为:

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


#include<iostream>

using namespace std;

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

int main()

{

    cout<<STR(1,2,3)<<endl;

    system("pause");

    return 0;

}



  输出结果为:

文件包含

  #include<文件名>称为标准方式,到系统头文件目录查找文件,#include"文件名"则先在当前目录(用户路径)查找,而后到系统头文件目录查找。

  我们以#include<iostream.h>和#include<iostream>为例说明:iostream.h是C语言格式的头(库)文件,为旧版本的标准库,只支持窄字符集;而iostream为C++的标准头文件,支持窄字符集和宽字符集。

  被包含文件中的静态全局变量不用在包含文件中声明。

条件编译

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

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

错误信息指令

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


#ifndef __cplusplus

#error this is not a C++ complier.

#endif

#include<iostream>

using namespace std;

int main()

{

    system("pause");

    return 0;

}

#line指令

  命令#line改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。

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


#include<iostream>

using namespace std;

#line 100 "a.cpp"

int main() {     cout<<__LINE__<<'\t'<<__FILE__<<endl;     system("pause");     return 0; }

  运行结果:

布局控制指令

  在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

  其格式一般为: #pragma Para,其中Para 为参数。

message 参数:在编译信息输出窗口中输出相应的信息

#pragma message("消息文本")

code_seg参数:设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它

#pragma code_seg(["section-name"[,"section-class"]])

#pragma once:

  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,但移植性差。如果写的程序要跨平台,最好使用C++中的宏定义。

#pragma hdrstop:表示预编译头文件到此为止,后面的头文件不进行预编译。

#pragma resource:

#pragma resource "winform.dfm"

表示把winform.dfm文件中的资源加入工程,winform.dfm中包括窗体外观的定义。

#pragma warning:输出警告信息。

我们运行一下程序:


int main()

{

    float f=3.6;

    int i=f;

    cout<<i<<endl;

    system("pause");

    return 0;

}

会出现如下警告信息:

1>ClCompile:1>f.cpp1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

若我们在程序上方添加:

#pragma warning(disable:4305)

则编译时警告信息会变为:


1>ClCompile:

1>f.cpp

1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断

1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据


若我们在程序上方添加:

#pragma warning(error:4244)

则警告信息会变为错误信息:


1>ClCompile:

1>f.cpp

1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

#pragma comment:该指令将一个注释记录放入一个对象文件或可执行文件中。

  常用的lib关键字,可以帮我们连入一个库文件。例如:

#pragma comment(lib,"wsock32.lib")

#pragma disable:在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。一般在C51中使用较多。

 类似资料:
  • 本文向大家介绍C#中的预处理器指令详解,包括了C#中的预处理器指令详解的使用技巧和注意事项,需要的朋友参考一下 目录 1. #define 和 #undef 2. #if、#elif、#else 和#endif 3. #warning 和 #error 4. #region 和#endregion 5. #line 6. #pragma   C#中有许多名为“预处理器指令”的命令。这些命令从来不会

  • 主要内容:C# 中的预处理器指令,#define 预处理器,条件指令预处理指令的作用主要是向编译器发出指令,以便在程序编译开始之前对信息进行一些预处理操作。在 C# 中,预处理器指令均以 开头,并且预处理器指令之前只能出现空格不能出现任何代码。另外,预处理器指令不是语句,因此它们不需要以分号 结尾。 在 C# 中,预处理指令用于帮助条件编译。不同于 C 和 C++ 中的指令,在 C# 中不能使用这些指令来创建宏,而且预处理器指令必须是一行中唯一的代码,不能掺杂其它

  • 预处理指令是一种给编译器的指令,用来在实际的编译开始之前预处理一些信息。 所有的预处理指令都以 # 开始,并且在一行预处理指令中,只有空白字符可以出现在指令之前。预处理指令没有声明,所以他们不需要以分号(;)结尾。 C# 编译器不具有独立的预处理机制;然而,指令执行的时候就像是只有这一条一样。在 C# 中,预处理指令被用来帮助条件编译。不像 C 或 C++ 的指令,他们不能创建宏。一个预处理指令必

  • 本文向大家介绍c#预处理指令分析,包括了c#预处理指令分析的使用技巧和注意事项,需要的朋友参考一下 预处理指令 这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面;列如,可以让编译器不编译某一部分代码等。 C#中主要的预处理指令 #define和#undef #define指令定义: 它告诉编译器存在DEBUG这个符号;这个符号不是实际代码的一部分,而只是在编译器编译代码时候可能会根据

  • 预处理指令 C语言规定:源程序中可以加入一些预处理指令。但预处理指令并不是C语言本身的组成部分,编译器不能识别它们,不能直接对这些指令进行编译。在使用时需要以“#”开头,用以与C语言区分。 所谓预处理,就是指源程序在进行编译的第一遍扫描(词法分析和语法分析)之前所做的工作由预处理程序完成。当对一个源程序进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理(代替),处理完毕自动进入对源

  • 本文向大家介绍C#预处理器指令的用法实例分析,包括了C#预处理器指令的用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下: C#预处理器指令是在编译时调用的。预处理器指令(preprocessor directive)告诉C#编译器要编译哪些代码,并指出如何处理特定的错误和警告。C#预处理器指令还可以告诉C#编辑器有关