forum icon indicating copy to clipboard operation
forum copied to clipboard

【Zig 日报】2024-05-07 如何仅在 debug 模式下声明某字段

Open jiacai2050 opened this issue 1 year ago • 0 comments

原文地址:Have a variable in a struct only in debug builds?

这个帖子主要讨论如何在 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

jiacai2050 avatar May 07 '24 01:05 jiacai2050