关于#define的初级问题

来源:百度文库 编辑:神马文学网 时间:2024/04/28 07:01:12
windef.h中第一行写到:
#ifndef _WINDEF_
#define _WINDEF_
意思是说如果没定义_WINDEF_,则定义_WINDEF_
我翻了一下C语言的书,76页,写到:
宏定义的形式如下:
#define 名字>>替换文本
可上句中的#define _WINDEF_,名称有了,替换文本是什么呢?是空白吗?
这样做的目的是什么呢?
另外:
_cdecl
__stdcall
是什么?
再另外这是什么意思?
#ifdef STRICT
typedef void NEAR* HGDIOBJ;
#else
DECLARE_HANDLE(HGDIOBJ);
#endif
不好意思,问了这么多菜问题。谢谢各位
_cdecl
按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。
如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
_stdcall
按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。
看看http://dev.csdn.net/develop/article/19/19460.shtm
顺便学习!
#ifndef identifier
your code
#endif
如果identifier为一个未定义的符号,your code就会被编译,否则剔除
#ifdef identifier
your code1
#else
your code2
#endif
如果identifier为一个定义了的符号,your code1就会被编译,否则your code2就会被编译
#define 名字>>替换文本 只是一种用法
如果不关心名字用什么东西替换,而只关心名字是否定义了的话,就直接使用
#define 名字 就行了
我可能没说明白我的第三个问题
我其实想问的是
typedef void NEAR* HGDIOBJ;是将哪个定义成哪个了?
一般情况是typedef 类型>>别名。上句中类型是什么?别名是什么?为什么有三个表达式
DECLARE_HANDLE(HGDIOBJ);是什么意思?
第一个问题怎么没人解释?谢谢
arrowcy(长弓手)
“#define 名字”的目的是什么?又做了什么?还是什么也不做?假如我在程序中用了“名字”,那么会被替换吗?
如果我不用的话,只是定义了有什么意义?
在DOS下,所有地址都可以表示为“段:段内偏移量”的方式,即XXXX:XXXX。如果在段内部进行操作使用near指针,即段采用当前的数据段,而指针地址为段内偏移量,这样通常更快些,但是所能表示的地址范围有限。为了表示更广的范围,可以使用far*(远指针),就是不管当前的数据段是什么,采用XXXX:XXXX的方式指明地址。
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
呵呵,我不是说了吗?
#ifndef identifier
your code
#endif
如果identifier为一个未定义的符号,your code就会被编译,否则剔除
而这里的your code就是
#define _WINDEF_
...//那个类的头文件其他的代码,你一定没有注意那个头的最后一行有#endif
是用来防止重复包含的,如果定义了_WINDEF_哪后面代码(头文件里面的其他的代码,)就不会被编译
typedef void NEAR* HGDIOBJ;是将哪个定义成哪个了?
typedef是用来定义新的整数类型
将HGDIOBJ定义为void NEAR*
明白点儿了,虽然没全懂,呵。我再消化消化,谢谢各位!!