七、预处理命令

一、预处理命令-宏定义

1.定义符号常量

#define PI 3.14
#define MAX_N 100

2.定义傻瓜表达式

#define MAX(a,b) (a > b ? a : b)
#define S(a, b) a * b

3.定义代码段

#define P(a) {\
	printf("%d", a);\
}

二、预处理命令-预定义的宏

说明
__ DATA__日期 : M mm_dd_yyyy
__ TIME__时间 :hh:mm:ss
__ LINE__行号
__ func__函数名/非标准
__ FUNC__函数名/非标准
__ PRETTY_FUNCTION__更详细的函数信息/非标准

三、预处理命令-条件式编译

函数说明
#ifdef DEBUG是否定义了 DEBUG 宏
#ifndef DEBUG是否没定义了 DEBUG 宏
#if MAX == 5宏 MAX 是否等于 5
#elif MAX == 3宏MAX是否等于 3
#else否则
#endif条件式编译最后需要些

四、练习

1.实现MAX宏,需要通过如下测试

1、MAX(2,3); --> 3
2、5 + MAX(2,3); --> 8
3、MAX(2, MAX(2,3)); --> 3
4、MAX(2, 3 > 4 ? 3 : 4); --> 4
5、MAX(a++, 6) a的初始值为7,函数返回值为7,a的值变为8

注:

展示预编译后的代码(可查看宏所替换生成的代码)
g++ -E file.cpp 

代码实现如下:

#include <stdio.h>

// __typeof(a) 根据参数a
#define MAX(a,b) ({\
    __typeof(a) _a = a;\
    __typeof(b) _b = b;\
    _a > _b ? _a : _b;\
})

// #a 将a的内容字符串话
#define P(a) {\
    printf("%s = %d\n", #a, a);\
}

int main() {
    int a = 7;
    P(MAX(2,3));
    P(5 + MAX(2,3));
    P(MAX(2, MAX(2,3)));
    P(MAX(2, 3 > 4 ? 3 : 4));
    P(MAX(a++, 6));
    P(a);
}

2.实现一个打印LOG的函数,需要输出所在函数及行号信息。
注:

__FILE__ 以字符串的形式返回所在文件名称
__func__ 以字符串的形式返回所在函数的名称
__LINE__ 以整数形式返回代码行号
在编译前预定义DEBUG
g++ -DDEBUG file.cpp 

代码实现如下

#include <stdio.h>

// #define DEBUG
// ## 链接
#ifdef DEBUG
#define log(frm, args...) {\
    printf("\033[32m[%s : %s : %d][0m  ", __FILE__, __func__, __LINE__);\
    printf(frm, ##args);\
    printf("\n");\
}
#else
#define log(frm, args...)
#endif

#define contact(a, b) a##b

int main() {
    int a = 123;
    printf("%d\n", a);
    log("%d", a);
    log("hello world");
    int abc, def;
    int abcdef = 0;
    contact(abc, def) = 123456;
    log("%d", abcdef);
    return 0;
}

3.宏相关的代码演示

#include <stdio.h>

#define COLOR(a, b) "\033[" #b "m" a "\033[0m"

#define GREEN(a) COLOR(a, 32)
#define RED(a) COLOR(a, 31)
#define YELLOW(a) COLOR(a, 33)

// 泛型宏 _Generic((a), )
#define TYPE_STR(a) _Generic((a),\
    int : "%d",\
    double : "%lf",\
    char : "%c"\
)

// 将此宏__attribute__下面的函数先于main函数去执行
__attribute__((constructor))
int add() {
    int a = 123, b=456;
    printf(RED("%d + %d = %d\n"), a, b, a + b);
    return a + b;
}

int main() {
    int a = 2;
    double b =  3.14;
    char c = 'a';
    printf(GREEN("a = %d, b = %lf, c = %c\n"), a, b, c);
    printf(TYPE_STR(a), a);
    printf("\n");
    printf(TYPE_STR(b), b);
    printf("\n");
    printf(TYPE_STR(c), c);
    printf("\n");
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值