2
回答
哪位大神分析一下c++中这几个宏定义的结构
开发十年,就只剩下这套Java开发体系了   

这几个c++的宏定义的结构不太明白是什么意思,特别是后面跟个0,哪位大神帮我分析分析,谢谢啦!

# define CHECKED_STACK_OF(type, p) \

    ((_STACK*) (1 ? p : (STACK_OF(type)*)0))


# define CHECKED_SK_COPY_FUNC(type, p) \
    ((void *(*)(void *)) ((1 ? p : (type *(*)(const type *))0)))


# define CHECKED_SK_FREE_FUNC(type, p) \
    ((void (*)(void *)) ((1 ? p : (void (*)(type *))0)))


# define CHECKED_SK_CMP_FUNC(type, p) \
    ((int (*)(const void *, const void *)) \

        ((1 ? p : (int (*)(const type * const *, const type * const *))0)))

<无标签>
举报
Miller_米勒
发帖于2年前 2回/157阅
共有2个答案 最后回答: 2年前

type是类型,p是指针,

这几个宏都是利用了三元运算符 c ? a : b返回的a或b的类型必须一致来做类型检查,实际返回的值都是p的值。

不过p的类型分别被转成了_STACK*,void*(*)(void*),void(*)(void*),int(*)(const void *,const void *)这几个类型。

第一看名字应该是栈指针,后三个是函数指针。

引用来自“士止刀口”的评论

type是类型,p是指针,

这几个宏都是利用了三元运算符 c ? a : b返回的a或b的类型必须一致来做类型检查,实际返回的值都是p的值。

不过p的类型分别被转成了_STACK*,void*(*)(void*),void(*)(void*),int(*)(const void *,const void *)这几个类型。

第一看名字应该是栈指针,后三个是函数指针。

谢谢大神的回答!

但是这个三目运算符是不是没有意义啊,

# define CHECKED_STACK_OF(type, p) \
    ((_STACK*) (1 ? p : (STACK_OF(type)*)0))
第一个中 1为真啦,直接就返回p,后面的表达式((STACK_OF(type)*))根本都不会运算的啊。
为什么要这样写?后面还加个0 是什么意思。百思不得其解,望大神进一步帮忙分析。谢谢!
--- 共有 3 条评论 ---
Miller_米勒回复 @士止刀口 : 明白了,非常感谢! 2年前 回复
大止刀口举个栗子:int *i = 1 ? 'c' : ((int*)0);这一句会编译出错,因为'c'是个char,而后面的是个int指针类型。这里的'c'相当于你那些宏里面的p,要通过就需要把'c'换做一个int指针。理解了吧?后面的值只有类型被用到了,就是来限制前面的类型,所以值不重要就给了一个0。所以你那些宏的用意是让编译器做这方面的类型检查。 2年前 回复
大止刀口就是做类型检查, c?a :b 我上面就提到了a和b的类型需要一致。如果不一致编译器会报错,b就是用来限制a的类型的。后面的0是表示该类型的一个值,因为a和b需要是同类型的两个值而不是类型。 2年前 回复
顶部