宏定义使用请教,宏定义可以改值么

时间:2021-12-17 19:44:50
例如我有一个A.c文件,和一个b.h文件
b.h文件中内容如下
#define MMMM  5
也可能没有宏定义MMMM

A.c文件内容如下:

void func1(int i){
if(i>8){
#undef MMMM    // 问题1:这个undef是否一定要有?
#define MMMM 10  
}
func2(15)//func1会调用函数func2,在func2中可能还会改变MMMM 的预定义 值
}

void func2(int c){
#ifndef MMMM
#define MMMM 18 // 问题2,在函数中再次这么改变MMMM的值可以么?
#endif
printf("%d",MMMM);

}
不知道我这个用法对不,宏定义可以放到函数中么?宏定义可以再次修改么?再次修改之前需要用undef先释放么?感谢

12 个解决方案

#1


1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误

#2


你的宏定义不是变量,它是立即数,也是常量,不占用内存。因此没有释放和不释放之说。
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。

#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;

#3


引用 1 楼 jianwen0529 的回复:
1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误

1)中的前提是你同时也包好了b.h头文件,没使用到是否会报重定义你可以测试下

#5


了解一下代码生成技术。

#6


1、可以没有,但如果已经定义过,编译器会给出一个警告,所以建议保留

#7


2、宏是在编译前静态替换的,定义在函数内并不表示执行这个函数才修改,而是从定义位置开始往下都按宏定义进行替换。如果人你要在函数中改变就要用变量,而不是宏

#8


2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)

#9


引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)

收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?
还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢

#10


引用 9 楼 sys0613 的回复:
Quote: 引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢


1、是的

2、”#define  在函数内定义的话,只在函数内生效“ 这句是错的!  #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用

#11


#undef 之前使用 #ifdef 来判断是否定义了,如果是,那么 #undef 她。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。

#12


引用 10 楼 paschen 的回复:
Quote: 引用 9 楼 sys0613 的回复:
Quote: 引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢


1、是的

2、”#define  在函数内定义的话,只在函数内生效“ 这句是错的!  #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用


简单易懂,多谢

#1


1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误

#2


你的宏定义不是变量,它是立即数,也是常量,不占用内存。因此没有释放和不释放之说。
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。

#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;

#3


引用 1 楼 jianwen0529 的回复:
1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误

1)中的前提是你同时也包好了b.h头文件,没使用到是否会报重定义你可以测试下

#4


#5


了解一下代码生成技术。

#6


1、可以没有,但如果已经定义过,编译器会给出一个警告,所以建议保留

#7


2、宏是在编译前静态替换的,定义在函数内并不表示执行这个函数才修改,而是从定义位置开始往下都按宏定义进行替换。如果人你要在函数中改变就要用变量,而不是宏

#8


2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)

#9


引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)

收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?
还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢

#10


引用 9 楼 sys0613 的回复:
Quote: 引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢


1、是的

2、”#define  在函数内定义的话,只在函数内生效“ 这句是错的!  #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用

#11


#undef 之前使用 #ifdef 来判断是否定义了,如果是,那么 #undef 她。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。

#12


引用 10 楼 paschen 的回复:
Quote: 引用 9 楼 sys0613 的回复:
Quote: 引用 8 楼 paschen 的回复:
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define  在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢


1、是的

2、”#define  在函数内定义的话,只在函数内生效“ 这句是错的!  #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用


简单易懂,多谢