可以定义宏,例如: 当定义了_DEBUG,输出数据信息和所在文件所在行: #ifdef _DEBUG#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)#else#define DEBUGMSG(msg,date)#endif ——— 20、宏定义防止使用时错误用小括号包含。 例如: #define ADD(a,b) (a+b) 用do{}while(...
6#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val))) 19. 使用一些宏跟踪调试 A N S I标准说明了五个预定义的宏名。它们是: 1_ L I N E _ 2_ F I L E _ 3_ D A T E _ 4_ T I M E _ 5_ S T D C _ 如果编译不是标准的,则可能仅支持以上宏...
2. 宏定义的有效范围称为宏定义名的辖域(也可以叫做生命周期,类似于变量的生命周期),辖域从宏定义的定义结束处开始到其所在的源程序文件末尾。宏定义名的辖域不受分程序结构的影响。可以用预处理命令#undef终止宏定义名的辖域。 3. 在新的宏定义中,可以使用前面已定义的宏名,示例: 代码语言:javascript 复制 # ...
虽然有些程序员会使用宏定义的方式来实现此目的,但类型定义(7.6节)仍然是定义新类型的最佳方法。 6) 、控制条件编译。如将在14.4节中看到的那样,宏在控制条件编译中起重要的作用。例如,在程序中出现的宏定义可能表明需要将程序在“调试模式”下进行编译,来使用额外的语句输出调试信息: #define DEBUG 这里顺便提一...
1.不带参数的宏定义。 例:输入圆的半径,求圆的周长(2*pi*r)和面积(pi*r*r). 代码语言:javascript 复制 #include<stdio.h>#definePI3.14159intmain(){float r;scanf("%f",&r);float s=PI*r*r;printf("S=%-10.3f\n",s);float c=PI*2*r;printf("C=%10.3f\n",c);return0;} ...
带参数的宏定义 带参数的宏定义的一般形式如下: #define 宏名(形参表) 字符串 例如#define M(a,b) a*b . . . s=M(3,5); 说明: 1. 上例宏调用的结果是s=3*5=15,即用实参3,5来代替形参a,b,实参个数要与形参个数相同,而没有类型要求, ...
指针变量的定义: int *p; 间接操作变量的值 int a = 10; p = &a; *p = 20; 三、构造类型 由基本数据类型组合构成 数组 1>只能由同一种类型的数据组成 2>定义:数据类型 数组名[元素个数] 结构体struct 1>可以由不同类型的数据组成 2>先定义类型,再利用类型定义变量 ...
宏定义基本语法 每个#define行(即逻辑行)由三部分组成:第一部分是指令 #define 自身,“#”表示这是一条预处理命令,“define”为宏命令。第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。第三部分“替换文本”可以是任意常数、表达式、字符串等。在预处理工作过程中...
函数调用在程序运行时实行,而宏展开是在编译的预处理阶段进行;函数调用占用程序运行时间,宏调用只占编译时间;函数调用 对实参有类型要求,而宏调用实在参数与宏定义形式参数之间没有类型的概念,只有字符序列的对应关系。函数调用可返回一个值,宏调用获得希望的C代码。另外,函数调用时,实参表达式分别独立求值在前,执行...
首先定义一个宏 #definepChar char* 再用pChar 定义两个变量,之后用操作符sizeof读取变量所占用内存大小,如果是指针类型的就占4个字节,如果是字符型的就占1个字节。 结果占用空间不一样,变量类型自然不一样,所以宏定义不是类型定义。那如果我换成typedef来定义类型呢?