c - 基于 sizeof 运算符的编译时断言
问题描述
鉴于sizeof()
operator 是一个编译时运算符(来自这个StackOverflow 接受的答案),我试图继续并基于它实现编译时类型检查。
我想要实现的是编译时检查参数是否为字符数组,如果不是,则引发编译错误。我的解决方案是基于字符消耗一个字节的事实。所以我想出了这个:
#define assert(maybeStr)\
extern int varaible_not_exist;\
if (sizeof(maybeStr[0]) != 1)\
{\
varaible_not_exist++;\
}
我发现如果sizeof(maybeStr[0])
在编译时评估,而不是整体if
可以在编译时评估,这意味着如果if
语句maybeStr
在编译时为假(确实是字符数组),varaible_not_exist++
最终不会被编译,并且不会发出编译错误。反之亦然,如果if
语句为真(maybeStr
不是字符数组),varaible_not_exist++
则将被编译并引发编译错误。
长话短说,它似乎奏效了。我现在只在online-c-compiler中对其进行了测试,但这个宏似乎可以完成这项工作。
现在,我的问题是这个宏是否可靠?我的意思是不同的编译器和不同的优化标志可能会产生不同的结果吗?
解决方案
我的意思是不同的编译器和不同的优化标志可能会产生不同的结果吗?
是的,这是可能的。您的代码不可靠。
如果您的编译器支持 C11,则可以改用静态断言:
#include <assert.h>
...
static_assert(sizeof(maybeStr[0]) == 1, "parameter must be a string");
推荐阅读
- jmeter - Jmeter HTTP 请求:它是如何工作的
- python-3.x - 每次使用 login() 方法时如何增加 +1 值?每次我使用这种方法时,它都显示相同的结果是“1”
- youtube - 在直播中插入 liveCuePoints - 出现错误 403 Forbidden
- c# - 如何正确使用 DelegateCommand?
- vim - 可视模式的 Vim 键映射
- wordpress - 我们可以在 WordPress 中创建类别列表页面吗?
- android - 使用带有 android 导航组件的默认后退按钮行为
- java - CodeForces 问题中的歧义 - HashSet 与 LinkedHashSet 的使用
- c++ - Qt - 如果在 html 中指定字体,QTextDocument 会中断自动换行
- javascript - 我指的是自定义排版的 Angular 材料,得到 SassError: Undefined variable 的错误