august 发表于 2007-12-11 10:24:29

define問題


#include "stdio.h"
#define exchange(a,b) { \ /*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/
            int t;\
            t=a;\
            a=b;\
            b=t;\
           }
void main(void)
{
int x=10;
int y=20;
printf("x=%d; y=%d\n",x,y);
exchange(x,y);
printf("x=%d; y=%d\n",x,y);
}


網上看到這樣的一個例子,但爲什麼運行不了呢?

shawind 发表于 2007-12-11 15:42:30

不太清楚c的宏是怎么回事,dmc下也是报错。
每次移植H文件为D模块的时候,宏总是让人头痛不已。

lw 发表于 2007-12-11 20:30:46

粘帖自网页很可能隐藏一些无聊的字符……看不到文本不表示一定就是空格或者Tab,在UE HEX下面就看到一串0xA1……不是0x20呢

另外其实开始是猜测\\和/*之间空格有错误,嗯,不可以有空格呢^^

每次移植H文件为D模块的时候,宏总是让人头痛不已。
不是很明白,没用过D,为什么宏这么麻烦???

shawind 发表于 2007-12-11 21:03:28

因为D中完全没有宏功能,要移植c中复杂的宏就只能借助模板之类的东西。
就比如说Windows中H文件吧

#define MAKEFOURCC(ch0, ch1, ch2, ch3)                              \\
      ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |   \\
      ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))

这样就可以把MAKEFOURCC当成函数一样到处用了。编译器会在编译期计算出结果。
D中就得写成这样

template T_MAKEFOURCC(ubyte ch0, ubyte ch1, ubyte ch2, ubyte ch3) {
    const T_MAKEFOURCC = cast(uint)ch0 | cast(uint)(ch1 << 8) | cast(uint)(ch2 << 16) | cast(uint)(ch3 << 24 );
}

得用上template才能在编译期算出结果。原来我是不想学什么范型编程的,结果一来二去,对模板倒明白了点。

rednaxela 发表于 2007-12-11 21:46:40

这很明显是#define那行的\\位置放错了……把\\放在那行的最后。搞清楚\\的作用——escape掉换行符。

lw 发表于 2007-12-12 20:03:09

偶反而觉得会误导偶对C++的TEMPLATE的理解……
还是慎用啊…………

shawind 发表于 2007-12-12 20:58:50

反正我又不怎么用c++的说,不用注意这个问题。
←其实是只会点c,不会c++

august 发表于 2007-12-13 18:00:55

#include "stdio.h"
#define exchange(a,b) {\\
int t;\\
t=a;\\
a=b;\\
b=t;\\
}
void main(void)
{
int x=10;
int y=20;
printf("x=%d; y=%d\\n",x,y);
exchange(x,y);
printf("x=%d; y=%d\\n",x,y);
}
原來這樣。。。
页: [1]
查看完整版本: define問題