C/C++ typedef 与 define的作用域

scorlw 发布于

C/C++ typedef 与 define的作用域

c++

#define

作用域有点类似于C/C++全局静态变量

编译器处理宏的时机是预处理阶段 编译器按文本顺序处理 遇到宏时就定义一个宏变量

假设这种情况

1
2
3
4
5
6
7
8
9
void test() {
#define MACRO 1
}

int main() {
#ifdef MACRO
printf("%d\n", MACRO);
#endif
}

输出:

1

main函数也是看得到MACRO宏的 因为文本顺序上test在前。编译器处理到test时定义了一个宏变量 使得main也能“看见“这个宏。

假如把顺序交换

1
2
3
4
5
6
7
8
9
int main() {
#ifdef MACRO
printf("%d\n", MACRO);
#endif
}

void test() {
#define MACRO 1
}

没有输出。

main就看不见MACRO宏了

不同源文件中的宏

不同源文件是看不到互相定义的宏的 除非将宏定义在了头文件中

宏的机制类似于全局变量 一般情况不会暴露给另一个源文件 除非你特意在头文件中暴露了它

1
2
3
4
5
6
7
8
9
#a.c
#define CX 1

#b.c
int main() {
#ifdef CX
printf("%d\n", CX);//不会被执行 因为看不到这个宏
#endif
}

如果想在b.c中使用CX,需要将#define CX 1定义在a.h中,并在b.c(或b.h)中包含a.h。

#define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。

typedef

typedef符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

void kk()
{
typedef char CHAR;
}

int main()
{
CHAR a = 3;
return 0;
}

报错:error: unknown type name ‘CHAR’

原文地址:https://blog.csdn.net/qq_21358401/article/details/80435855

https://blog.csdn.net/sanpam/article/details/82888685