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* 明白点儿了,虽然没全懂,呵。我再消化消化,谢谢各位!! |
|