forum
forum copied to clipboard
【Zig 日报】2024-05-07 如何仅在 debug 模式下声明某字段
这个帖子主要讨论如何在 Zig 中实现 C 中 #ifdef 的效果,比如下面 C++ 代码:
class Foo {
#ifndef NDEBUG
bool initialized;
#endif
void init() {
// do stuff
#ifndef NDEBUG
initialized = true;
#endif
}
void deinit() {
// do stuff
#ifndef NDEBUG
initialized = false;
#endif
}
void doSomething() {
#ifndef NDEBUG
assert(initialized == true && "You forgot to call init()!");
#endif
}
};
这一点其实在 Zig 中其实更自然,因为 Zig 具有强大的编译期执行的能力,对应下面的代码:
const std = @import("std");
const is_debug = @import("builtin").mode == .Debug;
const Foo = struct {
initialized: if (is_debug) bool else void,
pub fn init(self: *Foo) void {
if (is_debug) {
self.initialized = true;
std.debug.print("inited\n", .{});
}
}
};
pub fn main() !void {
var foo = Foo{
.initialized = if (is_debug) false else {},
};
foo.init();
std.debug.print("Sizeof: {d}\n", .{@sizeOf(Foo)});
}
上面的重点在于一个 struct 的类型是可以算出来的,而且是在编译期,另一点是 void 类型,它不占用空间,用在这里就十分合适,更多可以参考:Zero Bit Types 。测试运行:
$ zig run main.zig
inited
Sizeof: 1
$ zig run -O ReleaseSmall main.zig
Sizeof: 0