【问题标题】:Or'ing function parameters c++ [duplicate]Or'ing函数参数c ++ [重复]
【发布时间】:2014-06-04 21:39:07
【问题描述】:

我注意到许多函数采用参数或“标志”,如下所示:

foo(BIG | RED | SWEET);

其中BIGREDSWEET 在文件的前面已经被#define'ed,例如: #define BIG 0x1

我想实现我自己的函数,它采用上述参数,但我担心 ORing 两个数字一起可能等于 ORing 两个不同数字的相同结果。什么是定义这些变量以防止冲突的正确方法?

【问题讨论】:

  • 这些是按位或。所以变量通常是 0 和 2 的幂。0, 1, 2, 4...

标签: c++ function flags


【解决方案1】:

通常标志是 2 的幂,确保每个组合都是唯一的。

【讨论】:

    【解决方案2】:

    通常使用以下 2 的幂的十六进制模式来避免与标志冲突:

    #define A    (0x0000)
    #define B    (0x0001)
    #define C    (0x0002)
    #define D    (0x0004)
    #define E    (0x0008)
    #define F    (0x0010)
    #define G    (0x0020)
    #define H    (0x0040)
    #define I    (0x0080)
    #define J    (0x0100)
    ...
    

    或者更好的是,使用枚举:

    enum Flags
    {
        A = 0,
        B = 1 << 0,
        C = 1 << 1,
        D = 1 << 2,
        E = 1 << 3,
        F = 1 << 4,
        ...
    }
    

    这种 C++ 方法比那些十六进制定义更令人赏心悦目

    【讨论】:

    • 你当然应该建议使用enum 而不是一堆#define 指令!
    • 哈!好心疼!已更新。
    • 0x0000 不是二的幂。无法从生成的位集中恢复您的 A 标志。
    • 这就是为什么 0 传统上指的是没有设置标志。
    • @bstar55 在这种情况下,您可以只使用if(!flags),而不是更复杂的if(flags|A==A)if(flags==A)
    猜你喜欢
    • 1970-01-01
    • 2012-08-03
    • 2012-06-14
    • 2014-02-10
    • 2016-06-20
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多