社区
C语言
帖子详情
一个令我迷惑的宏定义问题
wwayya
2005-03-02 03:40:10
宏定义如下:
#define QINTERFACE(iname) \
struct _##iname {\
struct VTBL(iname) *pvt;\
};\
typedef struct VTBL(iname) VTBL(iname);\
struct VTBL(iname)
如果没有最后两句我还可以理解,可是加上最后两句我就糊涂了,请高手给我讲讲
...全文
159
13
打赏
收藏
一个令我迷惑的宏定义问题
宏定义如下: #define QINTERFACE(iname) \ struct _##iname {\ struct VTBL(iname) *pvt;\ };\ typedef struct VTBL(iname) VTBL(iname);\ struct VTBL(iname) 如果没有最后两句我还可以理解,可是加上最后两句我就糊涂了,请高手给我讲讲
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wwayya
2005-03-02
打赏
举报
回复
谢谢 suyouxin(为什么划船不用浆)的提醒,我看了一下调用形式就明白了:
//IBase是调用的参数
QINTERFACE(IBase)
{
INHERIT_IBase(IBase);
};
把QINTERFACE展开后再加上后面大括号的内容,结果就是:
struct _IBase{
struct VTBL(IBase) *pvt;
};
typedef struct VTBL(IBase) VTBL(IBase);
struct VTBL(IBase){
INHERIT_IBase(IBase);
};
这样就清楚了,谢谢大家的帮助。
sandrowjw
2005-03-02
打赏
举报
回复
看这个
#define VTBL(iname) iname##Vtbl
#define QINTERFACE(iname) \
struct _##iname {\
struct VTBL(iname) *pvt;\
};\
typedef struct VTBL(iname) VTBL(iname);\
struct VTBL(iname)
QINTERFACE(test)
{
int i;//实际上这里应该放函数指针
};
int main()
{
_test tt;
testVtbl tv;
tt.pvt->i = 0;
tv.i = 0;
return 0;
}
sandrowjw
2005-03-02
打赏
举报
回复
在C里面,结构体
struct struct_name
{
\\...也可以先声明,把定义放在后面
};
必须用
struct struct_name varname;
这样的形式来定义变量,所以用
typedef struct struct_name struct_name,
这样以后就可以直接用struct_name了。
struct_name varname;
winstonch
2005-03-02
打赏
举报
回复
如果这样用这个宏
QINTERFACE(AAA)
会被替换为(不考虑换行问题)
struct _AAA {
struct AAAVtbl *pvt;
};
typedef struct AAAVtbl AAAVtbl;
struct AAAVtbl
kobefly
2005-03-02
打赏
举报
回复
suyouxin(为什么划船不用浆) ( ) 信誉:100 2005-03-02 16:21:00 得分: 0
那就是一个声明了
看看用的时候是不是QINTERFACE(AAA);加了个分号
我想也是这样的
就是一个声明
你想我们自己在写宏的时候
最后也是不加分号的
在实际调用的时候后边会加上分号的
suyouxin
2005-03-02
打赏
举报
回复
那就是一个声明了
看看用的时候是不是QINTERFACE(AAA);加了个分号
wwayya
2005-03-02
打赏
举报
回复
我看了VTBL的定义是#define VTBL(iname) iname##Vtbl
那最后一句是不是换成了struct inameVtbl了?可是这样也说不通啊
winstonch
2005-03-02
打赏
举报
回复
你没去找找看VTBL是不是也是一个宏
wwayya
2005-03-02
打赏
举报
回复
最后一句是一个声明?还是什么?不太明白啊
wwayya
2005-03-02
打赏
举报
回复
对,对,我不明白的就是这个宏最后来一句struct VTBL(AAA)是什么意思?
kobefly
2005-03-02
打赏
举报
回复
这是一个很长的宏啊
其中就用到了一个##宏连接符
将_和iname连接起来
宏就是一个简单的替换
最后就展开成一楼兄弟所说的样子
yjh1982
2005-03-02
打赏
举报
回复
typedef struct structname structname ;也是合法的
winstonch
2005-03-02
打赏
举报
回复
如果这样用这个宏
QINTERFACE(AAA)
会被替换为(不考虑换行问题)
struct _AAA {
struct VTBL(AAA) *pvt;
};
typedef struct VTBL(AAA) VTBL(AAA);
struct VTBL(AAA)
VTBL 是不是也是一个宏?
c语言学习关键字的书写
例如,定义
一个
新的类型`TreeNode`来表示树节点: ```c typedef struct TreeNode { int value; struct TreeNode* left; struct TreeNode* right; } TreeNode; ``` 之后提到的“struct结构体”和“union联合体”...
国际C语言混乱代码大赛所有得奖源码
参赛者可能会编写出复杂的
宏定义
,这些宏在编译时被展开,形成看似随机的代码结构。理解和追踪宏的展开过程,对于解析这类混乱代码至关重要。 四、类型转换的陷阱 在混乱代码中,类型转换往往被滥用,用于制造混淆...
cmake取消
宏定义
_Cmake 脚本对预处理器的
宏定义
但是有些
宏定义
,你即使通过Visual Studio右键的go to definitions 和go to decleration就是找不到
宏定义
的位置,其实是在vcproject,.sln工程文件的项目属性里面就定义好了。因为在VS中时GUI界面的操作,所以容易找...
Windows SDK的数据类型定义和
宏定义
对于
一个
新人来说,第一次接触SDK编程或者说API编程,什么最
迷惑
你们的,我们讲它,我觉得Windows SDK中那'烦人'的数据类型定义和
宏定义
应该算这个很角色吧。。 其实微软的本意也是善良的,为了减轻程序员的负担...
C语言
70,024
社区成员
243,253
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章