首页 /  技术专区  /  C 宽屏模式 >

预编译关键字——#line、#、##

1、 defined 

我们在介绍#if时就介绍过defined的使用,它常与#if、!配合使用。

#if defined MACRO1 && !defined MACRO2
...
#endif

由于前面介绍过,所以我们这里就不在赘述。

2、 #line

2.1 作用

可以根据你自己的需求,修改__LINE__和__FILE__的值,也就是修改行号和文件名。

修改的值永久生效。

2.2 举例理解:

a.c 

#include <stdio.h>

int main(void)
{
    #line 1 "b.c"
    printf("%d %s\n", __LINE__, __FILE__);
    return 0;
}

查看预编译结果:

int main(void)
{
    #line 1 b.c
    printf("%d %s\n", 1, "a.c");
    return 0;
}

2.3 使用#line修改行号和文件名有什么意义

实际上对于我们自己写C/c++程序而言,几乎用不到#line这个东西,只有我们在看某些源码时才会见到它。

至于使用#line修改行号和文件名,到底有什么意义,这个问题我们这里不介绍,因为一两句话说不清楚,我们只要知道#line的作用是修改行号和文件名就行。

3、 #和##

很多学习c语言的同学很容易忽略这两个东西,但是在源码中,这两个玩意经常出现。

大家在理解了#和##的用法后,也希望大家在自己的C程序中使用,以提高自己代码质量。

3.1 #

(1)作用:将宏参数变为字符串。

这里讲的#与#define、#include中的#的作用是不同的,不要搞混了。

(2)例子

1)例子1

#include <stdio.h>
#define STR(s) #s

int main(void)
{
    printf("%s\n", STR(hello world));
    return 0;
}

STR(hello world)的替换过程:

STR(hello world) ————————>#hello wolrd ——————> "hello world"

查看预编译后的结果:

...
...
# 5 "helloworld.c"
int main(void)
{
    printf("%s\n", "hello world");
    return 0;
}

疑问:# 5 "helloworld.c"是什么意思?

表示.i中该部分的内容,来至于那个文件。


2)例子2

#include <stdio.h>
#define STR1(s) #s" wolrd"
#define STR2(s) "hello "#s

int main(void)
{
    printf("%s\n", STR1(hello));
    printf("%s\n", STR2(world));
    return 0;
}

查看预编译后的结果:

int main(void)
{
    printf("%s\n", "hello"" wolrd"); 
    printf("%s\n", "hello ""world");
    return 0;
}

疑问: "hello"" wolrd"这种写法可以吗?

答:可以,与"hello world"是等价的。


STR1(hello)————————>#hello" wolrd"————————>"hello"" wolrd"  

3.2 ##

(1)作用:将两个标识符连接在一起,合成一个标识符

(2)例子

#include <stdio.h>
#define ADDR1 0x12343654
#define ADDR2 0x54543243
#define MACRO(a, b) a##b

int main(void)
{
    int *p = MACRO(ADDR, 1);
    return 0;
}

MACRO(ADDR, 1)处理的过程:

MACRO(ADDR, 1) ——————> ADDR##1 ———————> ADDR1 ————————>0x12343654

查看预编译后的结果:

int main(void)
{
    int *p = 0x12343654;
    return 0;
}


头像
0/200
图片验证码