代码之家  ›  专栏  ›  技术社区  ›  me_and

如何巧妙地避免C语言丢失真相

  •  5
  • me_and  · 技术社区  · 15 年前

    (var_a == var_b) ? TRUE : FALSE
    

    但是,最好的解决方法是什么:

    /* Header stuff */
    #define INTERESTING_FLAG 0x80000000
    typedef short int BOOL;
    
    void func(BOOL);
    
    /* Code */
    int main(int argc, char *argv[])
    {
            unsigned long int flags = 0x00000000;
    
            ... /* Various bits of flag processing */
    
            func(flags & INTERESTING_FLAG); /* func never receives a non-zero value
                                             * as the top bits are cut off when the
                                             * argument is cast down to a short 
                                             * int
                                             */
    }
    

    是否可以接受(无论您使用的可接受值是多少) (flags & FLAG_CONST) ? TRUE : FALSE ?

    9 回复  |  直到 15 年前
        1
  •  5
  •   Jerry Coffin    15 年前

    我更喜欢 (flags & CONST_FLAG) != 0 . 更好的方法是,如果你有_Bool类型,就使用它(尽管它经常伪装成 bool ).

        2
  •  6
  •   jarnbjo    15 年前

    在任何一种情况下,我都会用 (flags & INTERESTING_FLAG) != 0 flags & INTERESTING_FLAG .

        3
  •  4
  •   Thomas    15 年前

    尽可能详细地设置编译器标志,以警告丢失位的任何转换,并将警告视为错误。

        4
  •  4
  •   tony    15 年前

    有些人不喜欢,但我用!!。

    !!(flags & CONST_FLAG)
    

    如果更多的人使用它,就不会被视为不寻常 所以开始使用它吧!!

        5
  •  1
  •   Chris Lutz    15 年前

    这可能不是一个流行的解决方案,但有时宏是有用的。

    #define to_bool(x) (!!(x))
    

    func(to_bool(flags & INTERESTING_FLAG));
    

    另一种选择可能是将布尔类型定义为 intmax_t stdint.h

    当我在这里的时候,我想说你应该使用 typedef #define :

    typedef short Bool; // or whatever type you end up choosing
    

    const 变量而不是数值常量的宏:

    const INTERESTING_FLAG = 0x80000000;
    

    总的来说,你可以把时间花在更好的事情上。但是宏用于 类型定义 这有点傻。

        6
  •  0
  •   David Oneill    15 年前

    您可以通过两种不同的方式避免这种情况:

    首先

    void func(unsigned long int);
    

    if(flags & INTERESTING_FLAG)
    {
      func(true);
    }
    else
    {
      func(false);
    }
    

    我也会这么做。

    (flags & INTERESTING_FLAG) != 0 也很好。可能更好。

        7
  •  0
  •   Laserallan    15 年前

    我还将创建一个帮助函数,让读者清楚地知道检查的目的是什么,这样就不会在代码中到处都使用这种显式的标志检查。Typedefing标志类型将使以后更容易更改标志类型和实现。

    现代编译器支持内联关键字,可以消除函数调用中的性能开销。

    typedef unsigned long int flagtype;
    ...
    inline bool hasInterestingFlag(flagtype flags) {
       return ((flags & INTERESTING_FLAG) != 0);
    }
    
        8
  •  0
  •   Bernd Jendrissek    15 年前

     flags & INTERESTING_FLAG ? TRUE : FALSE
    

    ?

        9
  •  0
  •   AnT stands with Russia    15 年前

    这就是为什么只有当这些值具有明确的布尔语义时,才应该以“布尔”方式使用这些值。您的值不满足taht规则,因为它具有明显的整数语义(或者更准确地说,是位数组语义)。要将此值转换为布尔值,请将其与 0

    func((flags & INTERESTING_FLAG) != 0);