请教高手们,宏定义的变量的值能printf出来吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教高手们,宏定义的变量的值能printf出来吗相关的知识,希望对你有一定的参考价值。

C程序中,我想弄清楚宏定义的变量的值,能不能用printf打印出来呢,如果可以的话,在printf语句中类型怎么定义的?
我提到的宏定义如下:
#define PCBROADCAST_IOC_MAGIC 'c'
#define PCBROADCAST_IOCSPARAM _IO(PCBROADCAST_IOC_MAGIC, 1)
想打印PCBROADCAST_IOCSPARAM的值。

可以啊,看下面的程序:
#define abc 1234567890
void main(void)
printf("%d",abc);

输出是1234567890。
至于你说的在printf语句中怎么定义类型的问题,要这样理解:要按照你的需要选择输出语句的数据类型控制符。机器内部其实就没有什么类型的区别,你愿意用什么样的类型输出都行。只是类型不匹配了输出的内容就变样了,但并没有“错”。比如你要输出PCBROADCAST_IOC_MAGIC,如果你用控制符%c,打出来就是c;若用控制符%d,那打出来就是99。但这都没错。你要想输出PCBROADCAST_IOCSPARAM的值,要想匹配的话,那要看后面的函数_IO(PCBROADCAST_IOC_MAGIC, 1)(是函数吧?看着像)返回什么类型的值了,而且这值是不是能打印的符号!
有一点要明白,你题中的说法有点问题,宏定义的不是变量而是符号。定义变量是要在内存中分配存储单元的,而宏定义不分配内存,只是个替代符号——在宏定义以后的程序中用前面的字符串代替后面的字符串!所以它没有类型也不需要类型,后面那个字符串的类型是什么,那么前面那个替代字符串的类型也就是什么。你打印时写PCBROADCAST_IOCSPARAM与写_IO(PCBROADCAST_IOC_MAGIC, 1)是没有任何差别的!
参考技术A 一般可以的,但是符号是不能打印的,像整型什么的,是可以的!

c++ 在编译时对define所定义的变量是怎么处理的?

我知道普通的变量和函数,好像是在编译的时候会生成一个Obj的目标文件!那#define EXT 4;之类的怎么处理呢

宏定义在编译的时候进行替换。
#define EXT 4 不安全,建议修改成 #define EXT (4)追问

那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?

追答

你需要相同还是不同?
如果需要定义相同,定义在一个同文件,其他使用文件包含此同文件即可。
如果需要定义不同,1: 修改各个宏,保证名字不同,这样风险低。
2: 不用修改宏,但保证各个文件相互无包含。那么宏仅仅作用于自身所在文件。

参考技术A 以#开头的命令叫编译预处理命令,这此命令是在编译前进行处理的。若程序开始有#define EXT 4,则编译前就会用查找替换命令将程序中所有的EXT替换成4。追问

那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?

追答

#define EXT 4 的有效范围仅限于定义文件。

参考技术B 对define处理是在编译之前进行的.
会把所有的EXT都替换为4.追问

那有很多文件都有#define EXT 4这个呢?但是不同的文件又对EXT的定义不同怎么办?

追答

各自用各自的啊.

参考技术C 这种情况它不叫变量,也不是常量,只是简单字符串代替,编译的时候换回去,这样做只是为了编写和阅读代码更方便更易懂

以上是关于请教高手们,宏定义的变量的值能printf出来吗的主要内容,如果未能解决你的问题,请参考以下文章

求助!请教VBA高手! 有没有哪位高手有编制过调用翻译软件实现在excel中,英文译成中文的?

c++ 在编译时对define所定义的变量是怎么处理的?

define定义的常量可以改变吗

请教高手:用西门子s7-PLCSIM进行模拟时,不能通过HMI改变PLC变量的值(只能显示)……哪的问题?

请教高手:memset函数详细讲解?

请教下街机三国志模拟器WinKawaks宏设置问题