LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 973|回复: 3

还是宏的问题[搞定]

[复制链接]
发表于 2007-11-14 22:41:10 | 显示全部楼层 |阅读模式
http://www.linuxsir.cn/bbs/thread316904.html提过类似的问题
现在看起来不是作用域的问题...
这个代码还是出错的:
#include  <stdio.h>
#include  <stdlib.h>
#define  FOO(T,  DATA)  ((T)({                          \
        *m_data  =  DATA  ;                                        \
        *m_data;                                                        \
}))

struct  _m{
        int  id;
        char  name[16];
};

int  main(){
        struct  _m  mm={1,  "shellex"};
        struct  _m  *m_data  =  (struct  _m  *)  malloc(sizeof  (struct  _m  ));   
        
        printf("name  =  %s\n",  FOO(struct  _m,  mm).name);
        free(m_data);
        return  0;
}
但是这个用第三个参数接受地址就没问题:
#include <stdio.h>
#include <stdlib.h>
#define FOO(T, DATA, buf) {             \
    *m_data = DATA ;                    \
    buf = m_data;                            \
}

struct _m{
    int id;
    char name[16];
};

int main(){
    struct _m mm={1, "shellex"}, *buf;
    struct _m *m_data = (struct _m *) malloc(sizeof (struct _m ));  
    FOO(struct _m, mm, buf);
    printf("name = %s\n", buf->name);
    free(m_data);
    return 0;
}

为什么呢...?请大家赐教...
发表于 2007-11-15 08:59:43 | 显示全部楼层
这两个例子的区别在于 "结构" 与 "结构指针", 抱歉我语法学的不好, 想不起合适的词汇来表达, 不过, 不要尝试在这种用法下返回结构, 要用指针.

另外, 建议楼主不要写出这样的宏, 语义不明确, 又依赖于具体的上下文. 为什么不用 inline 函数来实现同样的功能呢, 甚至来说, 直接用一句简单代码就可以实现的功能为什么还要单独 "封装" 呢, 没有特别的理由请不要这样做, 只会降低程序的可读性及可维护性
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-15 11:40:43 | 显示全部楼层
恩,这个只是简化的例子,为了测试这个语法的可行性,真正的代码比较有结构性,不是这样的.
好吧,我想要是不返回结构,返回指针是不是成功呢? 回去用编译器试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-15 15:43:50 | 显示全部楼层
验证通过,返回地址就行了...我还没有想明白....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表