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)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误
#2
你的宏定义不是变量,它是立即数,也是常量,不占用内存。因此没有释放和不释放之说。
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。
#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。
#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;
#3
1)中的前提是你同时也包好了b.h头文件,没使用到是否会报重定义你可以测试下
#5
了解一下代码生成技术。
#6
1、可以没有,但如果已经定义过,编译器会给出一个警告,所以建议保留
#7
2、宏是在编译前静态替换的,定义在函数内并不表示执行这个函数才修改,而是从定义位置开始往下都按宏定义进行替换。如果人你要在函数中改变就要用变量,而不是宏
#8
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
#9
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?
还有一个问题,刚才有小伙伴说#define 在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢
#10
1、是的
2、”#define 在函数内定义的话,只在函数内生效“ 这句是错的! #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用
#11
#undef 之前使用 #ifdef 来判断是否定义了,如果是,那么 #undef 她。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。
#12
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define 在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢 2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
1、是的
2、”#define 在函数内定义的话,只在函数内生效“ 这句是错的! #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用
简单易懂,多谢
#1
1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误
#2
你的宏定义不是变量,它是立即数,也是常量,不占用内存。因此没有释放和不释放之说。
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。
#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;
宏定义可以定义在函数内,甚至是结构体内定义宏定义也可以,也可以定义在头文件里,源文件里的任何位置,定义的位置只会影响其作用域。
#undef是取消宏定义的指令,即一个宏定义已经定义,可以通过#undef取消定义,即取消它的作用,不能称为释放。这样可以重新定义,实现修改初始定义的大小;
#3
1)要用,除非你的两个宏定义一模一样,否则会报重定义
2)可以的,在哪个地方定义都一样,属于全局性的东西。而且又#ifndef MMMM进行判断,那么也不会造成重定义的错误
1)中的前提是你同时也包好了b.h头文件,没使用到是否会报重定义你可以测试下
#4
#5
了解一下代码生成技术。
#6
1、可以没有,但如果已经定义过,编译器会给出一个警告,所以建议保留
#7
2、宏是在编译前静态替换的,定义在函数内并不表示执行这个函数才修改,而是从定义位置开始往下都按宏定义进行替换。如果人你要在函数中改变就要用变量,而不是宏
#8
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
#9
2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?
还有一个问题,刚才有小伙伴说#define 在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢
#10
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define 在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢 2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
1、是的
2、”#define 在函数内定义的话,只在函数内生效“ 这句是错的! #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用
#11
#undef 之前使用 #ifdef 来判断是否定义了,如果是,那么 #undef 她。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。
#宏仅仅是编译前做词法分析的时候有效,然后就无效了。等不到运行时。
#12
收到,多谢,那也就是说,我想根据func1的入参的值来决定MMMM值,这个想法行不通吧?不可能等到调用函数以后,再定义MMMM的值是这个意思吧?还有一个问题,刚才有小伙伴说#define 在函数内定义的话,只在函数内生效?如果只是我的func2函数,没有函数func1,那么函数func2里面#define的宏定义,在函数外还可见么?还能用么?谢谢 2、可以再次改变MMMM的值,但这都是静态的(在编译前),而不是动态的(运行时调用函数时)
1、是的
2、”#define 在函数内定义的话,只在函数内生效“ 这句是错的! #define根本并不知道函数,从定义的位置开始到本编译单元结束都可以使用
简单易懂,多谢