宏定义函数样例

合集下载

二级必过法宝之chap6函数与宏定义

二级必过法宝之chap6函数与宏定义

return result;
} 返回运算结果*/
第14页
表示不返回结果
2.不返回运算结 果的函数定义
void 函数名(参数表) /* 函数首部 */ { /* 函数体 */ 函数实现过程 return; /* 可以省略return */ }
这类函数通常用于屏幕输出等 不能省略 否则 函数类型被默认定义为int
20:18
第4页
程序结构
main( )
函数1
函数2
… …
函数m
函数 1_1
函数 1_2
函数 m_1
… …
函数 m_n
20:18
第5页
• main()也是一个函数,C程序由一个main() 或多个函数构成。 • 程序中一旦调用了某个函数,该函数就会 完成一些特定的工作,然后返回到调用它 的地方。
1、函数经过运算,得到一个明确的运算结果, 并需要回送该结果。例如,函数add()返回两个 数的和。 2、函数完成一系列操作步骤,不需要回送任何 运算结果。
20:18
第10页
函数定义1: int abs_sum(int m, int n) { if (m<0) m=-m; if(n<0) n=-n; return(m+n); }
20:18
函数定义2: int abs_sum(m, n) int m,n { if (m<0) m=-m; if(n<0) n=-n; return(m+n); }
20:18
第23页
4.函数原型声明
只写函数定义中的第1行(函数首部),并以分号结束。
函数类型 函数名(参数表);
double cylinder (double r, double h); void pyramid (int n);

c 宏定义 用法

c 宏定义 用法

c 宏定义用法
C语言中的宏定义是一种预处理指令,用于在编译之前将一些常量、函数、代码块等定义为一个标识符,方便代码的编写与管理。

宏定义的格式为:#define 标识符替换文本。

其中,标识符可以是任何合法的C语言标识符,替换文本可以是任何合法的C语句,包括常量、表达式、函数等。

宏定义有以下几种用法:
1. 定义常量:可以用宏定义来定义一些常量,例如#define PI 3.1415926,这样在代码中使用PI就相当于使用了常量3.1415926。

2. 定义函数:可以用宏定义来定义一些简单的函数,例如
#define ADD(a,b) (a+b),这样在代码中使用ADD(x,y)就相当于使用了函数x+y。

3. 定义代码块:可以用宏定义来定义一些代码块,例如#define SQUARE(x) (x*x),这样在代码中使用SQUARE(a)就相当于使用了a*a。

4. 定义条件编译:可以用宏定义来定义一些条件编译语句,例如#define DEBUG,这样在代码中使用#ifdef DEBUG和#endif就可以编写一些只在调试模式下才执行的代码。

需要注意的是,宏定义是一种简单的文本替换,因此可能会导致一些不可预期的问题,例如宏定义中的参数没有被正确使用时,就可能会导致编译错误或者逻辑错误。

同时,宏定义也不适用于一些复杂的操作,例如大量的循环、递归等,因为这可能会导致代码体积变大、可读性变差等问题。

因此,在使用宏定义时需要谨慎。

C语言宏定义

C语言宏定义

C语言宏定义定义简单的常数:定义常量,便于修改(切不可在后面加上分号!)#define N 1000等效于const int N = 1000; 但略有不同,define只是简单替换,而不是作为一个量来使用.定义简单的函数:注意多使用括号#define MAX(x, y) ((x) > (y)) ? (x) : (y)定义单行宏:主要有以下三种用法.1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不是字符串.多用于多行的宏定义中.例如:#define A(x) T_##x则int A(1) = 10; //等效于int T_1 = 10;#define A(x) Tx##__则int A(1) = 10; //等效于int T1__ = 10;2) 前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效(理解有误?)#define B(x) #@x则B(a)即’a’,B(1)即’1’.但B(abc)却不甚有效.3) 前加#,将标记转换为字符串.#define C(x) #x则C(1+1) 即”1+1”.定义多行宏:注意斜杠的使用,最后一行不能用斜杠.#define DECLARE_RTTI(thisClass, superClass)\virtual const char* GetClassName() const\{return #thisClass;}\static int isTypeOf(const char* type)\{\if(!strcmp(#thisClass, type)\return 1;\return superClass::isTypeOf(type);\return 0;\}\virtual int isA(const char* type)\{\return thisClass::isTypeOf(type);\}\static thisClass* SafeDownCast(DitkObject* o)\{\if(o&&o->isA(#thisClass))\return static_cast<thisClass*>(o);\return NULL;\}用于条件编译:(常用形式)#ifndef _AAA_H#define _AAA_H//c/c++代码#endif一些注意事项:1) 不能重复定义.除非定义完全相同.#define A(x) …和#define A是重复定义.2) 可以只定义符号,不定义值.如#define AAA关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。

c 函数内部宏定义

c 函数内部宏定义

c 函数内部宏定义C函数内部宏定义一、参数检查宏定义在函数内部,我们经常需要对参数进行检查,以确保参数的合法性。

为了简化参数检查的代码,我们可以使用宏定义来实现。

下面是一个示例:```#define CHECK_PARAM(param) \if (!(param)) { \printf("参数错误:%s\n", #param); \return; \}```在上面的示例中,我们定义了一个宏CHECK_PARAM,该宏接受一个参数param,并在参数为假时输出错误信息并返回。

通过使用这个宏,我们可以简化参数检查的代码,提高代码的可读性和可维护性。

二、条件编译宏定义在函数内部,有时我们需要根据不同的条件编译不同的代码。

为了简化条件编译的代码,我们可以使用宏定义来实现。

下面是一个示例:```#define DEBUG_MODE#ifdef DEBUG_MODE#define DEBUG_LOG(...) printf(__VA_ARGS__)#else#define DEBUG_LOG(...)#endif```在上面的示例中,我们定义了一个宏DEBUG_MODE,该宏用于开启或关闭调试模式。

当DEBUG_MODE被定义时,宏DEBUG_LOG会输出调试信息;当DEBUG_MODE未被定义时,宏DEBUG_LOG为空宏。

通过使用这个宏,我们可以方便地在调试模式和发布模式之间切换,提高代码的可维护性。

三、局部变量宏定义在函数内部,有时我们需要定义一些局部变量来辅助实现某些功能。

为了简化局部变量的定义,我们可以使用宏定义来实现。

下面是一个示例:```#define LOCAL_VAR(type, name, value) \type name = value;```在上面的示例中,我们定义了一个宏LOCAL_VAR,该宏接受三个参数:变量的类型type、变量的名称name和变量的初始值value。

C语言中的宏定义

C语言中的宏定义
1. n = MAX(i, MAX(j,k));
下面是预处理后的这条语句:
1. n=((i)>(((j)>(k)?(j):(k)))?(i):(((j)>(k)?(j):(k))));
2) 、宏参数没有类型检查。当一个函数被调用时,编译器会检查每一个参数来确认它们是 否是正确的类型。如果不是,或者将参数转换成正确的类型,或者由编译器产生一个出错信 息。预处理器不会检查宏参数的类型,也不会进行类型转换。 3) 、无法用一个指针来指向一个宏。如在 17.7 节中将看到的,C 语言允许指针指向函数。 这一概念在特定的编程条件下非常有用。 宏会在预处理过程中被删除, 所以不存在类似的 “指 向宏的指针”。因此,宏不能用于处理这些情况。 4) 、宏可能会不止一次地计算它的参数。函数对它的参数只会计算一次,而宏可能会计算 两次甚至更多次。如果参数有副作用,多次计算参数的值可能会产生意外的结果。考虑下面 的例子,其中 MAX 的一个参数有副作用:
1. #define getchar() getc(stdin)
空的参数列表不是一定确实需要, 但可以使 getchar 更像一个函数。 (没错, 这就是<stdio.h> 中的 getchar,getchar 的确就是个宏,不是函数 ——虽然它的功能像个函数。) 使用带参数的宏替代实际的函数的优点: 1) 、 程序可能会稍微快些。一个函数调用在执行时通常会有些额外开销—— 存储上下文 信息、复制参数的值等。而一个宏的调用则没有这些运行开销。 2) 、 宏会更“通用”。与函数的参数不同,宏的参数没有类型。因此,只要预处理后的程序 依然是合法的,宏可以接受任何类型的参数。例如,我们可以使用 MAX 宏从两个数中选出 较大的一个,数的类型可以是 int,long int,float,double 等等。 但是带参数的宏也有一些缺点。

内联函数-模板-宏定义

内联函数-模板-宏定义

内联函数-模板-宏定义内联函数: 内联函数的编译代码与其他代码内联起来,也就是说,编译器将使⽤相应的函数代码代替函数调⽤。

对于内联代码,程序⽆需跳转⾄;另⼀位置执⾏代码,再调回来。

因此内联函数的运⾏速度⽐常规函数快,但代价是需要消耗很多内存的。

如果程序在10个不同的地⽅调⽤同⼀内联函数,则该程序将包含该函数代码的10个副本。

内联函数的定义⽤inline内联函数的规则: 1> ⼀个函数可是⾃⼰调⽤⾃⼰,称为递归调⽤,含有递归调⽤的函数不能设置为inline; 2> 使⽤了复杂流程控制语句:循环语句和switch语句,⽆法使⽤内联函数; 3> 由于inline增加体积特征,所以建议内联函数内的代码应该较⼩。

4> 内联函数仅作为⼀种“请求”,待定的情况下,编译器不会理会inline关键字,⽽强制让函数成为普通的函数,编译器会给出警告; 5> 在你调⽤⼀个内联函数前,这个函数⼀定要在之前有声明或已定义为inline,如果在前⾯声明为普通函数,⽽在调⽤代码后⾯才定义为⼀个inline函数,程序可以通过编译器,但是该函数没有实现inline.函数模板: 模板是使⽤泛型来定义函数。

通过将类型作为参数传递给模板,可是编译器⽣成该类型的函数。

其定义是:emplate<class 数据类型参数标识符1,…,class 数据类型参数标识符n><返回类型><函数名>(参数表){函数体}宏定义: 宏定义不能值传递。

宏定义的优点: 1>提⾼了程序的可读性,同时也⽅便进⾏修改; 2>提⾼程序的运⾏效率:使⽤带参的宏定义即可完成函数调⽤的功能,⼜能避免函数的出栈⼊栈操作,减少系统开销,提⾼运⾏效率; 3>宏是预处理器处理的,通过字符串操作可以完成很多编译器⽆法实现的功能。

宏定义的缺点: 1>由于直接侵⼊,所以代码可能相对多⼀些; 2>嵌套定义过多可能会导致程序的可读性,⽽且很容易出错; 3>带参的宏⽽⾔,由于是直接替换,并不会检查参数是否合法,存在安全隐患。

c语言宏定义函数实例

c语言宏定义函数实例

宏定义在C语言中是一种预处理指令,它可以在编译之前对代码进行替换。

宏定义可以用来定义常量、创建函数等。

下面是一个简单的宏定义函数的例子:
```c
#include <stdio.h>
// 宏定义函数,将输入的两个整数相加
#define ADD(x, y) ((x) + (y))
int main() {
int a = 5;
int b = 10;
int sum = ADD(a, b);
printf("The sum of %d and %d is %d\n", a, b, sum);
return 0;
}
```
在这个例子中,我们定义了一个名为ADD的宏,它接受两个参数x 和y,并返回它们的和。

在main函数中,我们使用这个宏来计算两
个整数的和,并打印结果。

注意,为了在宏中使用加法运算符,我们需要使用括号将其包围起来,否则编译器可能会将其解析为乘法运算符。

c语言中宏定义

c语言中宏定义

c语言中宏定义在C语言中,宏定义是通过预处理器指令#define来实现的。

宏定义允许我们为代码中的常量、表达式或代码块定义一个名称,这样在代码中就可以使用这个名称来代替实际的常量、表达式或代码块。

宏定义的基本语法如下:c复制代码#define宏名称替换文本这里,宏名称是你定义的宏的名称,而替换文本是当宏在代码中被使用时,它将被替换成的文本。

1、定义常量:c复制代码#define PI 3.14159在代码中,每次你使用PI,它都会被预处理器替换为3.14159。

c复制代码double circle_area = PI * radius * radius;2、定义简单的表达式:c复制代码#define SQUARE(x) (x * x)使用这个宏,你可以轻松地计算任何数的平方。

c复制代码int y = SQUARE(5); // y 的值为 253、定义复杂的代码块:c复制代码#define MAX(a, b) ((a) > (b) ? (a) : (b))这个宏接受两个参数并返回它们之间的最大值。

c复制代码int max_value = MAX(3, 7); // max_value 的值为 7注意事项●宏定义只是简单的文本替换,没有类型检查或作用域限制。

●在定义带参数的宏时,最好将参数用括号包围起来,以避免由于运算符优先级导致的意外结果。

●宏可能会导致代码膨胀,因为预处理器会将每个宏调用替换为其对应的文本。

●宏不是函数,它们不会在调用时产生函数调用的开销。

但是,如果宏很复杂,它们可能会导致代码难以理解和维护。

总的来说,宏定义是C语言中一种强大的工具,但也需要谨慎使用,以避免潜在的问题。

C语言宏定义详解

C语言宏定义详解

C语言宏定义详解C语言的宏定义写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。

下面列举一些成熟软件中常用得宏定义:1,防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

typedef unsigned char boolean; /* Boolean value type. */typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */typedef signed long int int32; /* Signed 32 bit value */typedef signed short int16; /* Signed 16 bitvalue */typedef signed char int8; /* Signed 8 bit value *///下面的不建议使用typedef unsigned char byte; /* Unsigned 8 bit value type. */ typedef unsigned short word; /* Unsinged 16 bit value type. */typedef unsigned long dword; /* Unsigned 32 bit value type. */typedef unsigned char uint1; /* Unsigned 8 bit value type. */ typedef unsigned short uint2; /* Unsigned 16 bit value type. */typedef unsigned long uint4; /* Unsigned 32 bit value type. */typedef signed char int1; /* Signed 8 bit value type. */typedef signed short int2; /* Signed 16 bit value type. */typedef long int int4; /* Signed 32 bit value type. */typedef signed long sint31; /* Signed 32 bit value */typedef signed short sint15; /* Signed 16 bit value */typedef signed char sint7; /* Signed 8 bit value */3,得到指定地址上的一个字节或字#define MEM_B( x ) ( *( (byte *) (x) ) )#define MEM_W( x ) ( *( (word *) (x) ) )4,求最大值和最小值#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )5,得到一个field在结构体(struct)中的偏移量#define FPOS( type, field ) \/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */6,得到一个结构体中field所占用的字节数#define FSIZ( type, field ) sizeof( ((type *) 0)->field ) 7,按照LSB格式把两个字节转化为一个Word#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] ) 8,按照LSB格式把一个Word转化为两个字节#define FLOPW( ray, val ) \(ray)[0] = ((val) / 256); \(ray)[1] = ((val) & 0xFF)9,得到一个变量的地址(word宽度)#define B_PTR( var ) ( (byte *) (void *) &(var) )#define W_PTR( var ) ( (word *) (void *) &(var) )10,得到一个字的高位和低位字节#define WORD_LO(***) ((byte) ((word)(***) & 255))#define WORD_HI(***) ((byte) ((word)(***) >> 8))11,返回一个比X大的最接近的8的倍数#define RND8( x ) ((((x) + 7) / 8 ) * 8 )12,将一个字母转换为大写#define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )13,判断字符是不是10进值的数字#define DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')14,判断字符是不是16进值的数字#define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||\((c) >= ''A'' && (c) <= ''F'') ||\ ((c) >= ''a'' && (c) <= ''f'') )15,防止溢出的一个方法#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val)) 16,返回数组元素的个数#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) ) 17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n) #define MOD_BY_POWER_OF_TWO( val, mod_by ) \( (dword)(val) & (dword)((mod_by)-1) )18,对于IO空间映射在存储空间的结构,输入输出处理#define inp(port) (*((volatile byte *) (port)))#define inpw(port) (*((volatile word *) (port)))#define inpdw(port) (*((volatile dword *)(port)))#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))19,使用一些宏跟踪调试A N S I标准说明了五个预定义的宏名。

c语言宏定义格式

c语言宏定义格式

c语言宏定义格式C语言宏定义格式C语言中的宏定义是一种预处理指令,它可以将一些常用的代码片段定义为一个宏,以便在程序中多次使用。

宏定义的格式如下:#define 宏名替换文本其中,宏名是定义的宏的名称,替换文本是宏定义的内容。

宏名可以是任何合法的标识符,但是不能是C语言的关键字或保留字。

替换文本可以是任何合法的C语言代码,包括表达式、语句、函数等。

宏定义的作用是将一些常用的代码片段定义为一个宏,以便在程序中多次使用。

例如,我们可以定义一个求平方的宏:#define SQUARE(x) ((x)*(x))这个宏定义了一个名为SQUARE的宏,它的替换文本是一个表达式,用来求一个数的平方。

在程序中,我们可以使用这个宏来求任何一个数的平方,例如:int a = 5;int b = SQUARE(a);在这个例子中,宏SQUARE被展开为((a)*(a)),所以b的值为25。

宏定义还可以带参数,例如:#define MAX(x,y) ((x)>(y)?(x):(y))这个宏定义了一个名为MAX的宏,它的替换文本是一个表达式,用来求两个数中的最大值。

在程序中,我们可以使用这个宏来求任何两个数中的最大值,例如:int a = 5;int b = 7;int c = MAX(a,b);在这个例子中,宏MAX被展开为((a)>(b)?(a):(b)),所以c的值为7。

宏定义还可以使用条件编译指令,例如:#ifdef DEBUG#define DEBUG_PRINT(x) printf x#else#define DEBUG_PRINT(x)#endif这个宏定义了一个名为DEBUG_PRINT的宏,它的替换文本是一个printf语句。

在程序中,如果定义了DEBUG宏,则可以使用DEBUG_PRINT来输出调试信息,例如:#define DEBUGDEBUG_PRINT(("a=%d,b=%d\n",a,b));在这个例子中,宏DEBUG_PRINT被展开为printf(("a=%d,b=%d\n",a,b)),所以输出a和b的值。

c 函数宏定义格式

c 函数宏定义格式

c 函数宏定义格式
摘要:
一、函数宏定义概述
二、C语言中函数宏定义的格式
三、函数宏定义的注意事项
四、总结
正文:
一、函数宏定义概述
在C语言编程中,为了提高代码的可维护性和可读性,我们常常需要使用宏定义。

宏定义是一种将常量或代码片段替换为简短标识符的方法。

在C语言中,有两种类型的宏定义:函数宏定义和普通宏定义。

函数宏定义主要用于将一个函数替换为一个宏,从而简化调用该函数的方式。

二、C语言中函数宏定义的格式
在C语言中,函数宏定义的格式如下:
```c
#define 宏名(参数列表) 函数体
```
其中,`宏名` 是用于调用宏的标识符,`参数列表` 是传递给宏的参数,`函数体` 是宏要执行的代码。

在函数体中,我们可以使用`#`指令来引用参数列表中的参数。

例如,我们可以定义一个计算两个数之和的函数宏:
```c
#define ADD(a, b) ((a) + (b))
```
使用这个宏时,只需像调用普通函数一样调用它:
```c
int sum = ADD(3, 4); // 结果为7
```
三、函数宏定义的注意事项
1.宏名和参数列表之间不能有空格。

2.函数宏定义中的参数列表必须用括号括起来。

3.函数宏定义中的参数在宏体中可用`#`指令引用,例如`#1`、`#2`等。

4.函数宏定义不能嵌套定义。

5.函数宏定义中的参数可以是常量、变量或表达式,但不能是函数调用。

四、总结
C语言中的函数宏定义是一种将函数简化为宏的方法,可以提高代码的可读性和可维护性。

if判断的宏函数实现

if判断的宏函数实现

if判断的宏函数实现大家好,今天我将与大家分享如何使用宏函数实现IF判断。

宏函数在编程中起到简化代码、提高可读性的作用,尤其在C/C++等编程语言中广泛应用。

下面我们逐步了解IF判断宏函数的实现方法,并通过实例进行演示。

1.宏函数概述宏函数是指用一个字符串替换另一个字符串的一种技术。

在C/C++中,宏函数通常用大写字母表示,如MAX、MIN等。

宏函数可以在编译时进行替换,也可以在运行时进行替换。

在本文中,我们将使用宏函数实现IF判断。

2.IF判断宏函数的实现方法要实现IF判断的宏函数,我们可以使用预处理器指令`#if`、`#else`和`#endif`。

下面是一个简单的示例:```cpp#include <iostream>// 定义IF判断宏函数#define IF_MACRO(condition, true_value, false_value)((condition) ? (true_value) : (false_value))int main() {int a = 10;int b = 20;// 使用IF判断宏函数int result = IF_MACRO(a > b, "a大于b", "a小于等于b");std::cout << result << std::endl;return 0;}```在这个示例中,我们定义了一个名为`IF_MACRO`的宏函数,它接受三个参数:条件`condition`、真值`true_value`和假值`false_value`。

如果条件为真,则输出真值;否则输出假值。

在主函数中,我们使用这个宏函数判断变量a和b的大小,并输出结果。

3.实例演示下面我们通过一个具体的例子来演示如何使用IF判断宏函数:```cpp#include <iostream>// 定义IF判断宏函数#define IF_MACRO(condition, true_value, false_value)((condition) ? (true_value) : (false_value))int main() {int a = 10;int b = 20;// 使用IF判断宏函数std::string result = IF_MACRO(a > b, "a大于b", "a小于等于b");std::cout << result << std::endl;return 0;}```在这个例子中,我们依然使用`IF_MACRO`宏函数判断a和b的大小,并输出相应的结果。

C语言里常用的宏定义

C语言里常用的宏定义

01: 防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */typedef signed short int16; /* Signed 16 bit value */typedef signed char int8; /* Signed 8 bit value *///下面的不建议使用typedef unsigned char byte; /* Unsigned 8 bit value type. */ typedef unsigned short word; /* Unsinged 16 bit value type. */ typedef unsigned long dword; /* Unsigned 32 bit value type. */ typedef unsigned char uint1; /* Unsigned 8 bit value type. */ typedef unsigned short uint2; /* Unsigned 16 bit value type. */ typedef unsigned long uint4; /* Unsigned 32 bit value type. */ typedef signed char int1; /* Signed 8 bit value type. */ typedef signed short int2; /* Signed 16 bit value type. */ typedef long int int4; /* Signed 32 bit value type. */typedef signed long sint31; /* Signed 32 bit value */typedef signed short sint15; /* Signed 16 bit value */typedef signed char sint7; /* Signed 8 bit value */03: 得到指定地址上的一个字节或字#define MEM_B(x) (*((byte *)(x)))#define MEM_W(x) (*((word *)(x)))04: 求最大值和最小值#define MAX(x,y) (((x)>(y)) ? (x) : (y))#define MIN(x,y) (((x) < (y)) ? (x) : (y))05: 得到一个field在结构体(struct)中的偏移量#define FPOS(type,field) ((dword)&((type *)0)->field)06: 得到一个结构体中field所占用的字节数#define FSIZ(type,field) sizeof(((type *)0)->field)07: 按照LSB格式把两个字节转化为一个Word#define FLIPW(ray) ((((word)(ray)[0]) * 256) + (ray)[1])08: 按照LSB格式把一个Word转化为两个字节#define FLOPW(ray,val) (ray)[0] = ((val)/256); (ray)[1] = ((val) & 0xFF)09: 得到一个变量的地址(word宽度)#define B_PTR(var) ((byte *) (void *) &(var))#define W_PTR(var) ((word *) (void *) &(var))10: 得到一个字的高位和低位字节#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))11: 返回一个比X大的最接近的8的倍数#define RND8(x) ((((x) + 7)/8) *12: 将一个字母转换为大写#define UPCASE(c) (((c)>='a' && (c) <= 'z') ? ((c) – 0×20) : (c))13: 判断字符是不是10进值的数字#define DECCHK(c) ((c)>='0' && (c)<='9')14: 判断字符是不是16进值的数字#define HEXCHK(c) (((c) >= '0' && (c)<='9') ((c)>='A' && (c)<= 'F') \ ((c)>='a' && (c)<='f'))15: 防止溢出的一个方法#define INC_SAT(val) (val=((val)+1>(val)) ? (val)+1 : (val))16: 返回数组元素的个数#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))17: 返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)#define MOD_BY_POWER_OF_TWO( val, mod_by ) ((dword)(val) & (dword)((mod_by)-1))18: 对于IO空间映射在存储空间的结构,输入输出处理#define inp(port) (*((volatile byte *)(port)))#define inpw(port) (*((volatile word *)(port)))#define inpdw(port) (*((volatile dword *)(port)))#define outp(port,val) (*((volatile byte *)(port))=((byte)(val)))#define outpw(port, val) (*((volatile word *)(port))=((word)(val)))#define outpdw(port, val) (*((volatile dword *)(port))=((dword)(val)))19: 使用一些宏跟踪调试ANSI标准说明了五个预定义的宏名。

第六章函数与宏定义PPT课件

第六章函数与宏定义PPT课件
4.在第一种函数定义的形式中,[形参说明表]是一系 列用逗号分开的每个形参变量说明。
如:int x, int y, int z
这表示形参变量有三个:x, y, z。它们的类型都是int型。
在第二种函数定义的形式中,[ 形 参 表 ] 是 一 系 列 用 逗号分开的形参变量。如:x, y, z
5.函数语句体是放在一对花括号{ }中,由局部数据 类型描述和功能实现两部分组成。
11.11.2020
5
C 程序设计基础教程
第六章函数与宏定 义
6.函数返回语句的形式有以下两种: ①函数无返回值的情况:return; ②函数有返回值的情况:return(表达式的值); 在第②种情况下要注意“表达式的值”的类型必须与 函数返回值的类型相一致。
例如:求两个任意整数的绝对值的和,用函数 abs_sum()实现。
C语言中,函数可分为两类 :
一类是由系统定义的标准函数,又称为库函数,其函数 声明一般是放在系统的include目录下以.h为后缀的头文 件中,如在程序中要用到某个库函数,必须在调用该函 数之前用#include<头文件名>命令将库函数信息包含到 本程序中。
另一类函数是自定义函数 ,两种形式: 第一种:函数声明、函数调用、函数定义。 第二种:函数定义、函数调用。
第六章函数与宏定 义
第六章 函数与宏定义
§6.1 函数概念 §6.2 变量作用域和存储类型
§6.3 内部函数与外部函数
§6.4 递归函数设计和调用
§6.6 综合范例
11.11.2020
1
C 程序设计基础教程
§6.1 函数概念
第六章函数与宏定 义
C语言允许把问题设计成一个一个的模块,程序通过调用 模块功能来解决问题。这些模块通常都是通过函数来实 现的,又可称其为函数模块。

C语言中常用宏定义

C语言中常用宏定义

C语⾔中常⽤宏定义下⾯是⼀些⽐较重要的宏定义,记录⼀下:#define assert(cond) ((cond)?(void)0:_assert(#cond,__FILE__,__LINE__))void _assert(char*cond,char*filename,long lineno){printf("assert:%s in file:%s, at line:%d\n",cond,filename,lineno);}获得结构体中域的偏移量#define offsetof(type,field) ((int)((char*)&(((type*)0)->f)-(char*)(type*)0))#define OFFSETOF(type,field) ((int)&(((type*)0)->f)⼤⼩写转换#define toupper(ch) ((ch)+'A'-'a')#define tolower(ch) ((ch)+'a'-'A')三个数中求最⼤#define max(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))#define MAX(a,b,c) ((a)>((b)>(c)?(b):(c))?(a):((b)>(c)?(b):(c)))#define SET(n,i) ((n)|(1u<<i)) //置1#define RESET(n,i) ((n)&~(1u<<i)) //复位#define TOGGLE(n,i) ((n)^(1u<<i)) //取反#define TEST(n,i) !!((n)&(1u<<i)) //测试循环移位#define ROTL(val,n) (((val)<<n)|((val)>>(sizeof(val)*8-n)))#define ROTR(val,n) (((val)>>n)|((val)<<(sizeof(val)*8-n)))异或(XOR)逻辑运算#define XOR(a,b) (((a)||(b))&&!((a)&&(b)))宏实现SWAP交换#define SWAP(x,y) ((x)==(y)?NULL:((x)^=(y),(y)^=(x),(x)^=(y)))#define SWAP_(x,y) (temp=x,x=y,y=temp)//在使⽤前定义⼀个和x,y同类型的tmp临时变量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档