#define

最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass) /
 class X##localClass : public baseClass /

本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
后来问了几个朋友也都不知道。

你知道么?

也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int  n = Conn(123,456);  结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧


再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

最后留几个小试验给大家去测测:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
结果会如何呢? 嘿嘿嘿嘿~

------------------------------我是华丽的分割线---------------------------------------

本文转自:玩心未泯

### 定义与用法 在C语言中,`#define` 是一个预处理指令,用于定义宏[^2]。通过 `#define`,程序员可以定义符号常量或函数宏,这些定义会在编译之前被替换为实际的值或代码段。例如,以下代码展示了如何使用 `#define` 来定义一个符号常量: ```c #define PI 3.14159 ``` 在这个例子中,`PI` 被定义为数值 `3.14159`。当编译器遇到 `PI` 时,它会被替换为对应的值 `3.14159`[^2]。 此外,`#define` 还可以用于条件编译。例如,以下代码片段展示了如何根据是否定义了某个符号来决定是否编译特定代码块: ```c #define DEBUG /* defines the symbol DEBUG */ #ifdef DEBUG printf("Debug mode is enabled.\n"); #elif defined UNIX printf("UNIX mode is enabled.\n"); #else printf("Neither DEBUG nor UNIX is defined.\n"); #endif ``` 在此示例中,如果定义了 `DEBUG` 符号,则会执行第一个条件分支;如果未定义 `DEBUG` 但定义了 `UNIX`,则执行第二个分支;否则执行默认分支[^2]。 需要注意的是,`#define` 的作用范围仅限于文件内部,且它的行为完全发生在编译之前。这意味着,如果需要跨文件共享宏定义,通常需要将它们放置在头文件中,并通过 `#include` 指令引入[^3]。 ### 示例代码 以下是一个完整的示例,展示如何使用 `#define` 来简化代码并提高可读性: ```c #include <stdio.h> #define MAX(a, b) ((a) > (b) ? (a) : (b)) // 定义一个简单的最大值计算宏 int main() { int x = 10; int y = 20; printf("The maximum value is: %d\n", MAX(x, y)); // 使用宏计算最大值 return 0; } ``` 在这个例子中,`MAX` 宏接受两个参数,并返回它们中的较大值。通过这种方式,`#define` 可以帮助减少重复代码并提高代码的可维护性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值