预处理命令[#define]说明

宏定义

  宏定义是对一些常见的变量、字符串等进行定义,被定义的数据在编译会进行自动替换。有时一些变量或字符串被多次使用,当需要修改时,就需要对源文件中它们出现的地方一一修改,效率比较低,而通过宏定义,只需要对定义进行一次修改,就可以实现批量修改,提高效率,或者有时有些数字或字符需要多次输入,而数字或字符又不是很规律时,输入就会比较繁琐且容易出错。通过宏义将为输入和维护带来便利。

定义的格式

  #define 标识符 字符串

  其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

注意事项

  1.宏定义只是一种简单的代换,预处理程序对它不作任何检查。只能在编译已被宏展开后的源程序时发现错误。
  2.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
  3.宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

使用实例
  宏定义在处理有优先级顺序的表达式时,应加括号,避免导致被宏展开后出现优先级错误。例如下面的代码。

#define M a+b
s=M*M;
//等价于 s=a+b*a+b
///////////////////////////////////////////

#define M (a+b)
s=M*M;
//等价于 s=(a+b)*(a+b)
///////////////////////////////////////////

  c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。参见下面的代码。

#define C(x) (3.14*X*2)
c=C(5)
//等价于 c=(3.14*5*2)///////////////////////////////////////////
#define S(x,y) ((x)*(y))s=S(2+3,4+4)//等价于 s=((2+3)*(4+4))///////////////////////////////////////////

  不可以对调用时会产生变化的变量、操作数或表达式等进行宏定义,如下代码。

#define MIN(A,B) ((A)<(B)?(A):(B))
int a=1,b=5,min=0;
min=MIN(a++,b);//宏展开后表达式为:max=((a++)< (b)?(a++):(b))//返回值为min=3///////////////////////////////////////////

条件编译

  在头文件中通过使用#ifdef、#define和#endif的组合也可以进行条件编译。条件编译的目的是用以实现防止多个文件对此同一个头文件的重复引用。常见的格式如下。

#ifndef <</SPAN>标识>
#define <</SPAN>标识>
………   // include or define sth.
#endif

  

  

时间: 2024-10-24 05:56:52

预处理命令[#define]说明的相关文章

编译预处理命令--define和ifdef的使用

这里将对常用的预处理命令进行学习. 一.宏定义  ·defined 格式:`defined     宏名      数值 或者 `define      宏名 注意:后面没有‘;‘,和单片机不一样: 二.文件包含处理 ·include include 的格式在不同的编译器里是不一样的: 在quartus 中为:·include "defien.v" 在Primace中为:  `include "../src/define.v" 另外,一个include只可以指定一个

有预处理命令#define声明一个常数,用以表明1年中有多少秒

#define SECOND_PER_YEAR(60*60*24*356)UL (1)#define 不能以分号结束,括号这使用 (2)这个表达式将使一个十六位机的整型数移出,因此要用到长整型符号L,高速编译器这个常数是长整型的 (3)UL(表示无符号长整型)

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

 1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t start, end; double res = 0; time(&start);  //获取时间,传递给start //volatile强制每次从内存读取 volatile int i; for (i =

#pragma预处理命令

#pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样. #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma once 表示这个文件只被包含一次 #pra

C语言第十一回合:预处理命令的集中营

  [学习目标]   1.         宏定义 2.         文件包括"处理 3.         条件编译 预处理命令:能够改进程序设计的环境.提高编程效率. 其功能主要有三种:宏定义.文件包括.文件编译. ANSI标准定义的C语言预处理指令预览表 A: 宏定义 (a)不带參数的宏定义 格式:#define标识符 字符串 如:#define PI 3.1415926 *标识符被称为:宏名 *在预编译时将宏名替换成字符串的过程为:宏展开. *#define 是宏定义命令 //求圆周长

IOS使用C#预处理命令,多种SDK共存

当我们使用Unity接 91,XY助手等等SDK时候. 我们需要使用[DllImport("__Internal")] 来声明一个C++的方法调用. 不同的SDK总会有不同的方法. 我习惯是写成 XYSDK类,  Baidu91SDK类里面封装的各种[DllImport("__Internal")]声明的方法 问题就来了, 如果我们发布XY SDK,而91 SDK的方法并没有放在xcode工程里面. 所以造成编译不通过.我们就需要把91 C++封装好的方法放入工程当

C++预处理命令

预处理语句是由一系列和预处理相关的命令符组成的.预处理语句以#作为起始标记,其后紧跟预处理命令关键字,之后是空格,空格之后是预处理命令的内容.C++提供多种预处理功能,如宏定义,文件包括,条件编译等. #define 在这个教程的开头我们已经提到了一种预处理指令: #define ,可以被用来生成宏定义常量(defined constantants 或 macros),它的形式是: #define name value 它的作用是定义一个叫做name 的宏定义,然后每当在程序中遇到这个名字的时候

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE

C语言预处理命令详解

一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define).文件包含(#include).条件编译(#ifdef)等.合理使用预处理功能编