我正在查看 OpenSSL 中使用的一些预处理器宏,我发现了以下内容crypto/stack/safestack.h
:
#define CHECKED_STACK_OF(type, p) \
((_STACK*) (1 ? p : (STACK_OF(type)*)0))
#define CHECKED_SK_FREE_FUNC(type, p) \
((void (*)(void *)) ((1 ? p : (void (*)(type *))0)))
#define CHECKED_SK_FREE_FUNC2(type, p) \
((void (*)(void *)) ((1 ? p : (void (*)(type))0)))
我猜它是以这种方式编写的,是为了解决编译器错误(可能是供应商十多年来一直没有支持的古老东西)。
使用的目的是什么1
上面因为它总是正确的?
它是双重检查是否传递了正确类型的代码。传递了指针 p,并且还必须在宏中手动键入该指针的类型。
三元表达式将始终返回第二个操作数,但将检查第二个和第三个操作数是否类型匹配,如果不匹配,您将收到编译器错误。
一个简单的例子:
int* p = NULL ;
1 ? p : ( float* )p ; //error
1 ? p : ( int* )p ; //ok
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)