LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1221|回复: 4

关于一个#define XXX的作用的问题请教

[复制链接]
发表于 2005-3-9 22:47:51 | 显示全部楼层 |阅读模式
下面是在一个编程群里的讨论,但我觉得还是没有解决#define XXX是什么作用的结果,请兄弟们解惑


默默(me) 21:28:36
#define CORE_PRIVATE
请问大家,上面这个定义有什么用处?  
默默(me) 21:29:00
我常看到这样的空宏,但不解有什么用处?
bryan(me) 21:23:02
应该是用来作一个标记吧

bryan(me) 21:23:39
在其他的文件中,你会发现,ifdef CORE_PRIVATE   这就是标记了
★【蠕虫】★(me) 21:23:43
#ifndef
#define
#endif
★【蠕虫】★(me) 21:24:00
3 ge yi dui
Jerome·Wen(me) 21:24:58
防止头文件重复引用
默默(me) 21:31:15
那有什么作用吗?能否做个解释?
默默(me) 21:31:33
防止头文件重复引用?
bryan(me) 21:25:37
也可以用来移植
bryan(me) 21:26:00
跨平台的一般都这样定义
刀走偏锋(me) 21:26:25
有的程序会根据你是否用DEFINE定义了标记而调用不同的代码
默默(me) 21:32:47
如果防止重复,用
#ifndef
...
#endif
就可以,和
#define XXX
有什么关系?
bryan(me) 21:28:01
#define BSD_MODULE_BEING_COMPILED

#include <stdio.h>
#ifndef WIN32
#include <stdlib.h>         
#include <errno.h>
#include <syspes.h>          
Jerome·Wen(me) 21:28:20
基础书籍中都有....看了比你在这里回知道很多东西的
刀走偏锋(me) 21:29:23
刚才有人说了,移植问题,就像用DEFINE定义UNIQUE一样,为了不同版本的兼容性
默默(me) 21:35:27
基础书只讲基本的原型
#define AAA BBB
但我不明白:
#define AAA
用来做什么?
bryan(me) 21:30:10
刀走偏锋
说得对,看一下qt的代码就知道了
默默(me) 21:36:32
偏峰兄能简单给个例子说一下吗?
刀走偏锋(me) 21:30:43
代码会这样
#IFDEF AAA
你的代码
#ELSE
你的另外代码
#ENDIF
默默(me) 21:37:20
不是,上面的我明白,就是不明白:
#define XXX,你们等下,我打一段代码出来
刀走偏锋(me) 21:31:44
这样的话只要你用#DEFINE AAA在程序中就可以调用你的代码,如果不定义会调用你的另外代码
毁掉自已(me) 21:32:05
#ifndef xxxx
#define xxxx
A();
#endif
#ifndef xxxx
#define xxxx
A();
#endif
你说,是不是只有一次A()

刀走偏锋(me) 21:32:51
这个只是为了防止重复引用头文件
Jerome·Wen(me) 21:33:00
#define _SUN_
#define _UNIX_
#define _QNX_

#ifdef _QNX_
函数a
#....
函数b

毁掉自已(me) 21:33:19
如果你不想要A();只要#define xxxx,,就行了吧
Jerome·Wen(me) 21:33:35
产生预处理块的
默默(me) 21:40:37
让我好好看看,多谢上面的几位大哥
毁掉自已(me) 21:34:40
#ifndef xxxx
#define xxxx
A();
#endif
#ifndef xxxx
#define xxxx
A();
#endif
你说,是不是只有一次A()
如果你不想要A();只要在这些东东之前#define xxxx,,就行了吧  
刀走偏锋(me) 21:34:55
#ifdef AAA
f(char)
#else
f(wchar_t)
#endif
如果你用了#define AAA,下次你用F()调用就是用F(CHAR)
刀走偏锋(me) 21:35:32
不用#DEFINE定义的话用F()就是调用f(WCHAR——T)
默默(me) 21:44:45
如果前面用了#define AAA
那这段:
#ifdef AAA
代码1
#else
代码2
#endif
还有什么用?
你在代码前面已经写明了#define AAA了
那肯定是用代码2了
望解惑?
毁掉自已(me) 21:40:25
是用代码1吧
刀走偏锋(me) 21:40:41
用代码1
刀走偏锋(me) 21:41:02
代码2在你没有用DEFINE时才用
刀走偏锋(me) 21:41:16
为了让你的程序适应不同版本的软件
刀走偏锋(me) 21:42:04
我看的这方面用的最多的是宽字符处理,你可以看看WIN32编程,里面讲了很多
刀走偏锋(me) 21:44:51
我可以举个例子:
#ifndef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
因此,只要你定义了UNICODE标记,程序中的MessageBox函数实际上就是MessageBoxW函数,也就是处理宽字符,否则是MessageBoxA函数
刀走偏锋(me) 21:45:12
这些代码在VC的头文件里面可以看到很多
默默(me) 21:51:35
对,用代码1
我在my.c程序里写
#define AAA
#ifdef AAA
代码1
#else
代码2
#endif 其他代码

这样怎么适应不同版本呢?
刀走偏锋(me) 21:46:58
你的程序中只要用#define AAA就可以了,下面的代码是你的编译器提供给你的,你可以查看你的编译器的某些头文件,应该能够找到类似的代码
默默(me) 21:54:03
偏锋兄说的我开始明白了,我缺乏经验,还有一点不明,
程序中用了#define AAA
那是不是程序只合适一个版本了?
刀走偏锋(me) 21:49:02
适应不同的版本我已经说明白了,用不用DEFINE其实已经是两个版本了,比方我上面说的UNICODE,有的机器支持有的机器不支持,这就是不同的版本问题
毁掉自已(me) 21:50:15
如果 代码1是在winxp上运行的,,代码2是在win3.0上运行的,你用一个#define XXXX 就可以让他在winxp上run,你去掉#define xxxx就可以让它在win3.0上run,,
刀走偏锋(me) 21:50:39
对了
刀走偏锋(me) 21:50:48
就是那个意思
默默(me) 21:57:09
但用户自己是不会去删除源文件中的东西的?
刀走偏锋(me) 21:51:56
你的意思是?
默默(me) 21:59:27
可以下载一个源文件
此源文件有#define XXX可在XP下运行
没有,则可在windows3.0运行
那么,下载的用户怎么知道要去掉哪些行才能在它的XP系统上编译好这个程序?
默默(me) 21:59:38
也就是说安装好这个程序?
毁掉自已(me) 21:54:13
在linux当中,configure的脚本会自已检查看你的机子是xp,还是win3.0,,然后让它来决定要不要去掉#define xxxx
毁掉自已(me) 21:54:58
在win下也有这种工具,,但我对这种工具不了解
默默(me) 22:01:08
configure脚本并不会修改源文件--难道不是这样吗?
默默(me) 22:01:50
它只收集系统的环境信息
毁掉自已(me) 21:55:58
你可以#include<ust.h>,,是不是,,然后那个configure就来写这个ust.h文件嘛
默默(me) 22:05:23
晕,怎么是这样,头文件不是程序员包含进来的吗?
而且,包含的头文件是系统里已经有的,configure还会写出一个头文件来吗?
毁掉自已(me) 22:01:36
我知道在linux下有个叫config.h的好像是,,不过具体的原理你没有想过,,因为都是工具在帮你做好了,,对我来说是透明的,,win下我就更不清楚了,
默默(me) 22:10:34
呵呵,还是有点不明白,我人太笨了
我只是不明白这么写有什么用处。。。
毁掉自已(me) 22:06:14
当然有,,就是说让你带上潜水衣,,你在岸上也可以活,在水里也死不了嘛
刀走偏锋(me) 22:08:37
有个问题问大家,各位是学生还是已经工作了?
刀走偏锋(me) 22:08:44
我还是学生
默默(me) 22:16:58
我再明确一下我的问题,可以更清晰一点:
如果我在程序里写道:
#define XXX
我在支持XXX宏的系统里编译就会得到一个函数A
在不支持XXX宏的系统里编译就会得到一个函数B
那这个头文件:
#ifdef XXX
...
#else
...
#endif
这个是在哪里出来的?
默默(me) 22:17:14
我将工作,目前还是学生
刀走偏锋(me) 22:11:53
编译器提供给你的,这样你才能在支持XXX宏的系统里编译就会得到一个函数A
在不支持XXX宏的系统里编译就会得到一个函数B
默默(me) 22:20:44
回到我起初的问题,在apache源代码的第一行有一个
#define CORE_PRIVATE
我在支持CORE_PRIVATE里可编译,但在不支持CORE_PRIVATE的系统怎么保证能编译?
毁掉自已(me) 22:14:38
#ifdef XXX
...
#else
...
#endif
这是在你的程序中就要有的,,因为你在写程序是就要考虑你的程序可能会run在其它的系统上,
你就会用这个pre来做出种种的假设
毁掉自已(me) 22:17:06
说句实话,我不懂你的思路
默默(me) 22:23:49
如果和毁掉兄说的一样:
源代码则必然含有
#define XXX
#ifdef XXX
代码1
#else
代码2
#endif
那从逻辑上讲,上面的程序就等价于
代码1,那还用得着define吗?
默默(me) 22:24:57
我尽量说明白,不好意思,可能我哪里想错了,我很想纠正它,错的东西可不能留太久了:)
默默(me) 22:25:15
多谢诸位相助啦。。。
默默(me) 22:28:26
Jerome·Wen(me) 21:33:00
#define _SUN_
#define _UNIX_
#define _QNX_

#ifdef _QNX_
函数a
#....
函数b


默默(me) 22:28:56
就像上面这段代码,明明就是函数a,还怎么define?
毁掉自已(me) 22:24:20
你如你上面的那些在代码在一个文件的一个地方的话,,也就是A.c文件:
#define XXX
#ifdef XXX
代码1
#else
代码2
#endif ,这可能就是作者自已加上的#define xxx
因为他或者认为他有把握要用代码1,但他为何要设一个#ifdef呢,,这可能是如果有一天他想让这个程序来run到其它地方的话或者他要在试调的话,,他就可以自已来改这个代码(那当然不是用户),
默默(me) 22:33:31
可在apache里就有一句#define CORE_PRIVATE
下面则没有了ifdef之类的,那它这句的作用是什么呢?
默默(me) 22:35:58
但下面有一些包含文件,这里面有没有ifdef我则没有查看,但我觉得apache跨平台是不用这般去修改源代码才能编译出目标机的可执行文件吧?
毁掉自已(me) 22:31:30
那就更说明是作者在开发完了之后加上去的,,因为
用了#define CORE_PRIVATE就是在run正常的代码,如果不用可能就是run调试的代码呀(这个不是很肯定他的这个装置一定是为了试调,因为这要看到整个原码在知道,但我只是打个找方让你清楚)。
默默(me) 22:41:18
谢谢毁掉兄,我对#define CORE_PRIVATE的作用明白了一点了
默默(me) 22:42:55
也谢谢上面各位兄弟,有个不情之请,我把今晚讨论的内容发到论坛里,让其他人也讨论一下,看是不是有其他的看法
 楼主| 发表于 2005-3-9 22:57:44 | 显示全部楼层
我估计也是有兄弟看不了这么长的,所以,我在这里简略描述一下问题:
#define XXX的作用?
上面的人说是用来做个标记,可使用不同的代码,如
[PHP]#define XXX
#ifdef XXX
代码1
#else
代码2
#endif[/PHP]
那么,我想知道的是在一个源文件中若是有上面的代码为何不直接就用代码1呢?
这是第一个问题。
然后群里有人说在编译时要加上或去掉#define XXX这句以适应支不支持XXX宏的系统(或许是为了调试或是其他原因),我认为这个解释有些牵强,百思不得其解,求助于程序版的兄弟们,望解惑 :thank
回复 支持 反对

使用道具 举报

发表于 2005-3-10 12:57:51 | 显示全部楼层
不同的编译和运行环境要求程序代码在编写上也有所不同,有时这样的代码会很多。写程序的人希望这个程序在不做太多改变的情况下适应不同的环境,于是将那些适应不同系统的代码都写出来,用ifdef,else,endif分开,并用了一个“开关”,即#define XXX。当系统环境符合 XXX 的时候,就带着这一句编译;当系统环境不符合 XXX 的时候,就删除这一句。

当然还有其它用途,比如上面提到过的防止头文件重复包含,用
#ifndef XXX
#define XXX
/* 头文件的内容 */
#endif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-10 22:47:23 | 显示全部楼层
但是,要用户编译时修改源代码,那也是不可能的事啊?
回复 支持 反对

使用道具 举报

发表于 2005-3-11 08:34:18 | 显示全部楼层
主要是让开发者自己以及二次开发者改起来方便,不是要用户去改。当然,如果用户有源码而且知道 #define XXX 的含义也可以改。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表