社区
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)
如果没有最后两句我还可以理解,可是加上最后两句我就糊涂了,请高手给我讲讲
...全文
151
13
打赏
收藏
一个令我迷惑的宏定义问题
宏定义如下: #define QINTERFACE(iname) \ struct _##iname {\ struct VTBL(iname) *pvt;\ };\ typedef struct VTBL(iname) VTBL(iname);\ struct VTBL(iname) 如果没有最后两句我还可以理解,可是加上最后两句我就糊涂了,请高手给我讲讲
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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深度解析》第二章 C预编译——
宏定义
、条件编译、头文件包含、特殊预编译关键字
课程内容:(1)回顾c预编译(2)
宏定义
:无宏体宏、有宏体宏、带参宏、
宏定义
与复杂表达式。(3)条件编译:#if、#else、#elif #endif、#ifdef和#ifndef、#if与defined、条件编译与配置文件(4)一些特殊的预编译关键字与实际应用:defined、#error、#line、#与##、#pragma (5)文件包含:是否只能包含.h文件,<>与区别等。
cmake取消
宏定义
_Cmake 脚本对预处理器的
宏定义
我们有些时候会在#if #ifndef 等预编译命
令
里面看到_WIN32等定义的宏。但是有些
宏定义
,你即使通过Visual Studio右键的go to definitions 和go to decleration就是找不到
宏定义
的位置,其实是在vcproject,.sln工程文件的项目属性里面就定义好了。因为在VS中时GUI界面的操作,所以容易找出来,但是Cmake下,换了一种创建工程文...
Windows SDK的数据类型定义和
宏定义
Windows SDK的数据类型定义和
宏定义
对于
一个
新人来说,第一次接触SDK编程或者说API编程,什么最
迷惑
你们的,我们讲它,我觉得Windows SDK中那'烦人'的数据类型定义和
宏定义
应该算这个很角色吧。。 其实微软的本意也是善良的,为了减轻程序员的负担,和为了编程的方便,才花了那么多心思与精力定义出了这么一大套数据类型与
宏定义
,这也是我为什么在之前说它烦人都是加上引
c++代码里
宏定义
的理解
最近看代码经常看到满天飞的
宏定义
,尤其是带换行\,和##的,看的更
迷惑
,针对这种找了个典型来理解一下。 以下是vtk库中的代码,
宏定义
为: // // Set built-in type. Creates member Set"name"() (e.g., SetVisibility()); // #define vtkSetMacro(name,type) \ virtual void Set##name (type _arg) \ { \ vtkDebugMacro(<< this-&
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章