cxx笔记01-预处理与宏
目录
c++笔记001
C宏定义与说明
#、##、...
- #把参数插入到字符串中,只有在宏定义中(define)中使用
#define PRINT(x) printf("hello " #x) //这里的x将被替换成字符串输出。
PRINT(world); //输出:"hello world"
- ##连接两个标识符,只有在宏定义中(define)中使用
#define CAT(x,y) x##y
int studytoday = 2023
printf("%d\n",CAT(study,today); //输出:"2023"
printf("%s",CAT(hello,world); //编译出错gcc中不可用编译错误。只能vs
根据C标准,用##操作之后的结果必须是一个已经定义过的符号
- ...和__VA_ARGS__可变参数
#define PR(...) printf(__VA_ARGS__)
PR("%s=%d\n","spipping",studytoday); //输出:spipping=2023
error
输出一个错误信息
if
表达式非零就对代码进行编译。
defined
我们在介绍#if时就介绍过defined的使用,它常与#if、&&、||、!配合使用,是ifdef的一种高阶用法。
//如果MACRO01被定义和MACRO02未被定义执行if,否则执行else。
#if defined MACRO01 && !defined MACRO02
....
#else
....
#endif
//如果MACRO01或MACRO02被定义则执行if中代码,否则执行else中代码。
#if defined MACRO01 || defined MACRO02
....
#else
....
#endif
ifndef
如果宏未被定义
ifdef
如果宏被定义
else
否则
endif
结束编译块的控制
elif
这是一种#else和#if的组合选项。
define
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
#define <宏名> <字符串>
例如:#define NAME "hello"
#define <宏名> (<参数表>) <宏体>
例如:#define A(x) x
例如:#define STR(x) #x //把传入的x返回为字符串"x"
define的函数定义
#define max(x,y) (x)>(y)?(x):(y);
undef
终止的被定义的宏
line
可以根据你自己的需求,修改__LINE__和__FILE__的值,也就是修改行号和文件名
修改的值永久生效。
#include <stdio.h>
int main(void)
{
#line 1 "t.c"
printf("%d %s\n", __LINE__, __FILE__);
return 0;
}
查看预编译结果:
......
# 3 "test.c"
int main(void)
{
# 1 "t.c" // 含义:从下行开始,行号从1开始,文件名是t.c
printf("%d %s\n", 1, "t.c");
return 0;
}
使用#line修改行号和文件名有什么意义?
实际上对于我们自己写C/c++程序而言,几乎用不到#line这个东西,只有我们在看某些源码时才会见到它
至于使用#line修改行号和文件名,到底有什么意义,这个问题我们这里不介绍,
因为一两句话说不清楚,我们只要知道#line的作用是修改行号和文件名就行
progma
pragma comment
加载lib库。
#pragma comment(lib,"libcurl_a_debug.lib")
编译器内置宏
注意:某些宏可能编译器不同支持不一样。
ANSI C标准中有几个标准预定义宏(也是常用的):
__FUNCTION__ //当前所在的函数名称
__LINE__ //在源代码中插入当前源代码行号。
__FILE__ //在源文件中插入当前源文件名。
__DATE__ //在源文件中插入当前的编译日期
__TIME__ //在源文件中插入当前编译时间。
__STDC__ //当要求程序严格遵循ANSIC标准时该标识被赋值为1。
__cplusplus //当编写C++程序时该标识符被定义。
DEBUG("FILE: %s, LINE: %d…",__FILE__,__LINE__,…)
//其实没有必要,__FILE__本身就会被编译器置换为字符常量,于是乎我们的语句又变成了这样:
DEBUG("FILE:"__FILE__", LINE: %d…",__LINE__,…)
//但是,我们还是不满足,依然发现,还是很讨厌,为什么每条语句都要写"FILE:"__FILE__", LINE: %d 以及,__LINE,这两个部分呢?
//把DEBUG写成这样:
DEBUG(format,...) printf("FILE: "__FILE__", LINE: %d: "format"/n", __LINE__, ##__VA_ARGS__)
//所有的DEBUG信息都会按照这样的方式输出:
FILE: xxx, LINE: xxx, …….
相关代表系统的宏
- windows
_WIN32
_WIN64
- unix
__unix
__unix__
- apple mac os x
__APPLE__
__MACH__
- linux
__linux__
__linux
- FreeBSD
__FreeBSD__
- Android
__ANDROID__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了