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__
posted @   alvinlyb  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示