C/C++ #define的作用域

本文探讨了C/C++中宏定义的作用域特性,解释了宏如何在预处理阶段被编译器处理,以及其定义如何影响后续代码块。通过具体示例,展示了宏在不同函数间的可见性变化,强调了文本顺序对宏作用域的重要性。

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

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

假设这种情况

void test() {
#define MACRO 1
}

int main() {
#ifdef MACRO
// do some thing
#endif
}
main函数也是看得到MACRO宏的 因为文本顺序上test在前
编译器处理到test时定义了一个宏变量 使得main也能“看见“这个宏

假如把顺序交换
int main() {
#ifdef MACRO
// do some thing
#endif
}

void test() {
#define MACRO 1
}
main就看不见MACRO宏了

//#include<iostream> //using namespace std; ////别名替换 ////#define A B // //#define 整数 int //整数 a{ 100 };//可以是中文和字母,但是不能是数字、符号等。示例:12325。#$%(); // //#define _hhh_ int b=250;//define 在替换上会有点无脑,这里以后只要是输入 _hhh_ 都会替换成 int b; // //#define VERSION "2.0.1"//好处是我在“用的地方多了,在这改内容,可以直接作用到输出这个变量名内” //#define SCREEN_WIDTH 1980//声明常量,这个表达情况在C语言中用得比较多 //const int screen_width{ 1980 };//这个是在C++用得比较多,也是常量声明 // ////#define int float ////#define true false//用得太广泛,连true都可以变改,这里的话,容易不安全,在define的常量申明和替换,容易不安全 // //#define X //相当于X不存在了,去作为一种替换 //#define UNICON //定义UNICON的用法 // //#define _in_ //#define _out_ //这两个的意义都是关于标识, int ave(_in_ int a,_out_ int& b),告诉别人这个是输入,输出,没有太大意义 ////#define functionptr //定义一个指针int ave(_in_ int a,functionptr int& b)这里也是修饰符号的作用 // ///*int ave( _in_; int f, _out_ int& g) //{ //return a+b //};*/ // // //#define TEXT //int main() { // // // cout <<a<< " "<<endl; // // _hhh_{ 250; }//发现个问题 // cout << b<< " " << endl; // // cout << VERSION<<" "<<endl; // cout << SCREEN_WIDTH << " " << endl; // cout << screen_width; // // int X a{ 2500 };//当中的X相当于不存在 等同于 int a{2500} // // int TEXT A{ 250 }; // #undef TEXT // //int TEXT A{ 250 };//第三种用法就是undef会关停这个TEXT,但是不影响其他的 //} //定义复杂表达的宏 #include<iostream> using namespace std; #define SUM(X,Y) X+Y*3; #define RELEASE(x) delete[]x,x=nullptr; #define BIGGER(X,Y)((X)>(Y)?(X):(Y)) #define SHOW1(X)std::cout<<#X//用这个输出直接就是字符串 #define SHOW(X,Y) void X##Y(){std::cout<<#X;}//声明函数使用 //发现这里的define的应用,表达时不是表达式 SHOW(text,22)//这里是直接声明了个函数 int main() { cout << SUM(100, 200)" ";//这个不是函数,是直接表示计算 //cout << SUM(100, 200) << " " << endl;//这里这种表达需要表达式,怎么回事 int* a = new int[50]; RELEASE(a)" ";//可以很好的全局应用 //delete[]a; //a = nullptr; std::cout << BIGGER(100, 200)<<" "; SHOW1(1234687454565)" "; text22(); } 当中的两组代码,的注释理解都对吗,请帮助分析总结,因为我是个新手学员,搞不懂,请麻烦解释分析,帮助我理解底层逻辑,让我对deffine的理解通俗易懂,帮助我彻底理解整个他的内容
最新发布
07-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongjunhe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值