C++学习:第二章C语言基础 - (十三)宏

版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/82876747

1. 宏的定义

原样替换 #define

gcc –E *.c 查看宏替换后的效果

宏函数不存在传递参数、地址等问题,是直接贴过来代码,所以速度快,缺陷就是没有类型检查等内容

#include<stdio.h>

#define P printf(
#define H “hello\n”);

int main(){

    P H

    return 0;

}

 

2. 避免重复定义宏

宏不可以重复定义,为了避免重复,一般有以下写法:

#ifdef   如果定义过

#ifdef H

#undef H //取消对H的定义

#endif

 

#ifndef   如果没定义过

#ifndef H

#define H “aaa”

#else
    …
#endif

注意:如果在头文件中定义且导入了两次同样会认为重定义,因此有如下写法,多次导入头文件也不会出错:

#ifndef HEADER_H

#define HEADER_H 1

int x = 0;

#endif

3. C语言预先定义好的宏

C语言预先定义好的宏:双下划线开始和双下划线结束

__FILE__  //输出当前文件名

__LINE__  //输出当前行号

__DATE__  //输出当前日期

__TIME__  //输出当前时间

4. 宏定义——带参数

#include <stdio.h>

#define SWAP(T, x, y) {T t=x; x=y; y=t;}

int main(){

    int a=10, b=20;

    SWAP(int, a, b);

    return 0;

}
#include <stdio.h>

#define MAX(x, y) x > y ? x:y
#define PI 3.1415926
#define AREA(r) PI*r*r

int main(){

    int a=10, b=20;        

    printf("%d\n", MAX(a, b));

    printf("%g\n", AREA(10) );        

    getchar();

    return 0;
}

4.1 如果希望写成

printf("%g\n", AREA(10+20) );

现有的写法会报错,解决办法是加括号

#include <stdio.h>

#define MAX(x, y) x > y ? x:y
#define PI 3.1415926
#define AREA(r) PI*(r)*(r)

int main(){

    int a=10, b=20;        

    printf("%d\n", MAX(a, b));

    printf("%g\n", AREA(10+20) );

    getchar();

    return 0;
}

4.2 如果希望写成

printf("%d\n", MAX(a, b)+ MAX(a, b));

现有的写法会报错,解决办法是加括号

#include <stdio.h>

#define MAX(x, y) ((x) > (y) ? (x):(y))
#define PI 3.1415926
#define AREA(r) PI*(r)*(r)

int main(){

    int a=10, b=20;        

    printf("%d\n", MAX(a, b));

    printf("%g\n", AREA(10) );        

    getchar();

    return 0;
}

5. 宏定义 —— 井号

井号的作用是将参数转为字符串

#include <stdio.h>

#define STR(x) puts(#x)

int main(){

    STR(hello);

    getchar();

    return 0;
}

 

6. 宏定义 —— 双井号

双井号:用来拼接标识符,可以把参数和另外一个东西拼接为标识符

#include <stdio.h>

void wellcomStudent(){printf("abc\n");}
void wellcomTsacher(){printf("def\n");}
#define wellcom(who) wellcom##who()

int main(){

    wellcom(Student);

    getchar();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/kakiebu/article/details/82876747