打印

Keil C51支不支持可变参数长度的宏定义?

[复制链接]
9696|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aolin|  楼主 | 2008-12-19 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
来自 2楼
computer00| | 2008-12-19 16:20 | 只看该作者

嘿嘿,为此俺专门给你想了一个变态的用法:

#ifdef DEBUG
#define myprintf printf
#else
#define myprintf /
/myprintf
#endif

由于续行符的作用,define定义时不会发现是注释符“//”,但是在展开到代码之后,就成了注释符“//”了,
也就是说,如果你原来的代码是myprintf("%d",x);,经过这个宏展开后成了//myprintf("%d",x);,
相当于自动在前面加了注释符“//”,你看行得通不?

要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了...

使用特权

评论回复
板凳
computer00| | 2008-12-19 15:05 | 只看该作者

变通一下: #defing myprintf printf

使用特权

评论回复
地板
aolin|  楼主 | 2008-12-19 15:26 | 只看该作者

曾经跟你一样变通用过,但不可取

这样变通用后:
#ifdef DEBUG
#define myprintf  printf
#else
#define myprintf
#endif

DEBUG定义后一切都正常,当DEBUG不定义时,一大堆警告!

使用特权

评论回复
5
aolin|  楼主 | 2008-12-19 17:41 | 只看该作者

不错,有点意思,试试看

使用特权

评论回复
6
aolin|  楼主 | 2008-12-19 17:49 | 只看该作者

这个注意真的是高啊!

不错,试过了,很好用!
谢谢!

使用特权

评论回复
7
computer00| | 2008-12-19 17:53 | 只看该作者

嘿嘿,一般人俺不告诉他...

使用特权

评论回复
8
原野之狼| | 2008-12-19 18:34 | 只看该作者

圈圈方法不错

使用特权

评论回复
9
天马行空88| | 2008-12-19 20:26 | 只看该作者

不错

不错

使用特权

评论回复
10
ayb_ice| | 2008-12-20 19:34 | 只看该作者

如果写成两行或多行00的方法不行

使用特权

评论回复
11
computer00| | 2008-12-20 20:07 | 只看该作者

是的,多行或者带返回值都麻烦,要不改一种方法:

//#define DEBUG
#ifdef DEBUG
#define DBG(CODE) CODE
#else
#define DBG(CODE)
#endif

就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如

DBG(printf("%d",x);)

这样就不会出什么问题了,而且还可以在里面写很多行代码。

使用特权

评论回复
12
ayb_ice| | 2008-12-20 21:34 | 只看该作者

C宏好象不能实现多行解释"/**/"

当然是分开的/* 和 */,我一直没有搞定这个问题,我觉得这个定义非常有用.
但不知为什么可以重定义//解释
比如
#define END(a,b) a##b
END(/,/); // =//而且功能正常

使用特权

评论回复
13
computer00| | 2008-12-21 00:01 | 只看该作者

你想要实现什么样的功能呢?

可以考虑加续行符把注释打断。

使用特权

评论回复
14
ayb_ice| | 2008-12-21 10:14 | 只看该作者

我想实现

变量声明定义在一个文件中搞定,其实大部分功能已经实现,只是带初始化的而且多行定义的不太方便
比如:
int array[] =
{
  0,
  1,
  2
};
想变成
M1 int array[] M2 =
{
  0,
  1,
  2
};
M3
其中M123是相关的宏定义,配合完成定义和声明,定义时M123=空格是没有问题,
但声明时希望 M1=extern,M2=/*,M3=*/;,而M23实现不了.目前是用每行加M4=//实现的,//这对于大型变量效率太低.

使用特权

评论回复
15
computer00| | 2008-12-21 11:06 | 只看该作者

这个好象没办法,因为遇到第一个注释“/*”之后,

连后面的M3宏也当作注释内容被注释掉了,因此并没有对这个宏进行展开。

可以这样试试:

定义时:
#define M1
#define M2
#define M3 /
*

M1 int array[] M2 =
{
  0,
  1,
  2
};
M3*/

声明时:
#define M1 extern
#define M2 ;/
*
#define M3 

M1 int array[] M2 =
{
  0,
  1,
  2
};
M3*/


就是在M3后面人为地加上一个“*/”,当定义时,将M3定义为“/*”。
而声明时,M2为“;/*”,就注释掉了后面一段。

使用特权

评论回复
16
ayb_ice| | 2008-12-21 11:10 | 只看该作者

我去试试

不过你的这个解释还是蛮合理的.

使用特权

评论回复
17
ayb_ice| | 2008-12-21 11:25 | 只看该作者

试了一下,还是不行

一有机会,我就想办法,两年了一直搞不定,可能是编译器不支持吧.

下面就是我的变量定义声明一次搞定的方法

/* 这种方法可以
-------------------------------
EXT U8C Example[] IV1 =
IV2 {
IV2  0x00,0x01,0x02,0x03
IV2 };
-------------------------------
*/


/* 这种方法不可以
-------------------------------
EXT U8C Example[] IV3 =
{
  0x00,0x01,0x02,0x03,
  0x00,0x01,0x02,0x03
};IV4    // IV3,IV4方式有问题
-------------------------------
*/

使用特权

评论回复
18
computer00| | 2008-12-21 12:51 | 只看该作者

不会吧...我这个在keil、VC下试了,都可以正常使用呀...

你是什么编译器?

使用特权

评论回复
19
ayb_ice| | 2008-12-21 13:17 | 只看该作者

不好意思

我只是按你的意思自己去试了一下,可能有些地方搞错了刚才直接按你的原始文件处理了一下,好象真的可以,以前我也一直认为/*这部分功能正常,一直没有注意解决后面的*/的这个问题.
OO果然是高手,名不虚传.
C宏真是个好东西,发挥好了对程序大有帮助.
我再去仔细测试一下.

使用特权

评论回复
20
ayb_ice| | 2008-12-21 18:48 | 只看该作者

解决LZ的问题不用变态方法

#define M1(a,b) a##b
#ifdef _DEBUG
  #define myprintf printf
#else
  #define myprintf M1(/,/)
#endif
当然不要分两或多行写

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

396

帖子

2

粉丝