免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2744 | 回复: 9
打印 上一主题 下一主题

[C] C中宏的编译错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-05 19:54 |只看该作者 |倒序浏览
我下面这段代码在vc2005下会出现编译错误.
  1. typedef struct
  2. {
  3.   unsigned short DataLength;               // Number of bytes in TransData
  4.   unsigned char   *Data;
  5. } afMSGCommandFormat_t;

  6. typedef struct
  7. {
  8.   unsigned short groupId;
  9.   unsigned char SecurityUse;
  10.   afMSGCommandFormat_t cmd;
  11. } afIncomingMSGPacket_t;

  12. #define UART_SEND_PC_PARAM(cmd,shortAddr,pkt)\
  13.         uart_sendCmdMsgToPC(cmd, shortAddr, pkt->cmd.Data, pkt->cmd.DataLength)
  14. void uart_sendCmdMsgToPC(unsigned short cmd,unsigned short shortAddr,unsigned char   *Data,unsigned short len)
  15. {
  16.         return;
  17. }
  18. void main(void)
  19. {
  20.         afIncomingMSGPacket_t temPacket;
  21.         afIncomingMSGPacket_t *pkt = &temPacket;
  22.         UART_SEND_PC_PARAM(1,2,pkt);//错误出现在本语句中,如果直接用下面这句,就不会出现问题
  23.         //uart_sendCmdMsgToPC(cmd, shortAddr, pkt->cmd.Data, pkt->cmd.DataLength);
  24.         return;
  25. }
复制代码


出错信息是:
1>e:\mypro\testproj\testproj\main.c(72) : error C2059: 语法错误 : “数字上的错误后缀”
1>e:\mypro\testproj\testproj\main.c(72) : error C2059: 语法错误 : “常量”
1>e:\mypro\testproj\testproj\main.c(72) : error C2059: 语法错误 : “数字上的错误后缀”

我的理解是UART_SEND_PC_PARAM宏只是进行一种替代操作,所以一直不能理解为什么会出现这个编译问题.

论坛徽章:
0
2 [报告]
发表于 2008-09-05 19:58 |只看该作者
uart_sendCmdMsgToPC,这个是什么?

就是main上面的那个函数

看漏了

[ 本帖最后由 tyc611 于 2008-9-5 20:22 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-09-05 20:04 |只看该作者
就是main上面的那个函数

论坛徽章:
0
4 [报告]
发表于 2008-09-05 20:14 |只看该作者
原帖由 burning423 于 2008-9-5 19:54 发表
我下面这段代码在vc2005下会出现编译错误.
typedef struct
{
  unsigned short DataLength;               // Number of bytes in TransData
  unsigned char   *Data;
} afMSGCommandFormat_t;

typede ...


应该是别的地方的错误 我的这个test代码 和你的相似 没有错误

int fun(int a, int b, int c) {
    return a + b + c;
}

#define  FUN(a, b, c) \
    fun(a, b, c)

int main()
{
    int c = 1;
    FUN(1, 2, c);
    return 0;
}

论坛徽章:
0
5 [报告]
发表于 2008-09-05 20:21 |只看该作者
原帖由 burning423 于 2008-9-5 19:54 发表
我下面这段代码在vc2005下会出现编译错误.
typedef struct
{
  unsigned short DataLength;               // Number of bytes in TransData
  unsigned char   *Data;
} afMSGCommandFormat_t;

typede ...

宏定义里有cmd,宏参数里也有cmd,显然是错的。
而且所有的宏参数都应该用括号括起来。

论坛徽章:
0
6 [报告]
发表于 2008-09-05 20:21 |只看该作者
恩,你那样子的我也写过,是没有问题的.我奇怪的是,当我把程序改成下面的,编译就能通过了.不会出错.

  1. typedef struct
  2. {
  3.   unsigned short DataLength;               // Number of bytes in TransData
  4.   unsigned char   *Data;
  5. } afMSGCommandFormat_t;

  6. typedef struct
  7. {
  8.   unsigned short groupId;
  9.   unsigned char SecurityUse;
  10.   //afMSGCommandFormat_t cmd;
  11.   unsigned short DataLength;              //把这两个参数直接放到这个结构里
  12.   unsigned char   *Data;
  13. } afIncomingMSGPacket_t;

  14. #define UART_SEND_PC_PARAM(cmd,shortAddr,pkt)\
  15.         uart_sendCmdMsgToPC(cmd, shortAddr, pkt->Data, pkt->DataLength)//把pkt->cmd.Data, pkt->cmd.DataLength用pkt->Data, pkt->DataLength代替
  16. void uart_sendCmdMsgToPC(unsigned short cmd,unsigned short shortAddr,unsigned char   *Data,unsigned short len)
  17. {
  18.         return;
  19. }
  20. void main(void)
  21. {
  22.         afIncomingMSGPacket_t temPacket;
  23.         afIncomingMSGPacket_t *pkt = &temPacket;
  24.         UART_SEND_PC_PARAM(1,2,pkt);//错误出现在本语句中,如果直接用下面这句,就不会出现问题
  25.         //uart_sendCmdMsgToPC(cmd, shortAddr, pkt->cmd.Data, pkt->cmd.DataLength);
  26.         return;
  27. }
复制代码


想不明白到底是什么原因.

论坛徽章:
0
7 [报告]
发表于 2008-09-05 20:24 |只看该作者
原帖由 xiaonanln 于 2008-9-5 20:21 发表

宏定义里有cmd,宏参数里也有cmd,显然是错的。
而且所有的宏参数都应该用括号括起来。


不是你说的这个问题
参数显然不是错的

ps:
不过产生了副作用 把其他的参数也替换了 bad style

[ 本帖最后由 blizzard213 于 2008-9-5 20:25 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-09-05 20:24 |只看该作者
原帖由 burning423 于 2008-9-5 20:21 发表
恩,你那样子的我也写过,是没有问题的.我奇怪的是,当我把程序改成下面的,编译就能通过了.不会出错.

typedef struct
{
  unsigned short DataLength;               // Number of bytes in TransData
  uns ...

因为你的cmd值是1,pkt->cmd.DataLength就被替换成 pkt->1.DataLength

论坛徽章:
0
9 [报告]
发表于 2008-09-05 20:24 |只看该作者
我晕,谢谢xiaonanln..是我自己粗心了...

论坛徽章:
0
10 [报告]
发表于 2008-09-05 20:24 |只看该作者
原帖由 burning423 于 2008-9-5 20:21 发表
恩,你那样子的我也写过,是没有问题的.我奇怪的是,当我把程序改成下面的,编译就能通过了.不会出错.

typedef struct
{
  unsigned short DataLength;               // Number of bytes in TransData
  uns ...

才看到,原来你的宏参数cmd和结构体内的重名了,把宏参数cmd换个名
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP