承认C中的良性类型演员

时间:2013-12-15 13:58:21

标签: c casting warnings type-conversion

我一直在努力解决如何最好地处理C中隐式强制的警告。

让我们从一个非详尽的例子清单开始。编译器的迂腐程度往往差异很大。

int main(int argc, char *argv[]) {
    /* Truncation from 'const int' to 'float' */
    float a = 16777217;
    /* Potential loss of sign in conversion from `int' to `unsigned int' */
    unsigned int b = 1;
    /* Conversion from 'int' to 'char', possible loss of data */
    int c = 1;
    char d = c;
    /* Conversion from 'int' to 'unsigned char', possible loss of data */
    uint16_t e = 1;
    uint8_t f = e >> 8;
    /* Pointer targets in initialization differ in signedness */
    unsigned int *g = &argc;
    /* Initialization from incompatible pointer type (technically an error) */
    const char *const *h = argv;
    /* Different 'volatile' qualifiers */
    const volatile char *i = *argv;
    strlen(i);
    /* Generates a warning in an old embedded C compiler. No off-hand reference. */
    char *j = malloc(1);
    return 0;
}

原则上这些都是有益的,并且经常揭示真正的错误。问题是,一旦发现我承认它们的策略通常是通过过度指定的类型转换,治疗比疾病更糟糕,如果有的话,或通过降低警告级别或通过#pragmas选择性地禁用特别常见的警告。如果您被迫在严格的编码标准下工作,例如MISRA C,后一种补救措施当然是不可能的。

更高级的静态分析工具通常提供一些机制来指示C编译器很少看到的误报,并且无论如何这样的警告数字远非便携式。

这里推荐的最佳做法是什么?

我想我想要在C ++中使用const_cast,加上unsigned_cast,demotion_cast,volatile_cast以及你有什么。

最后,如果已经提出这个问题,我很抱歉,我想它已经有了,但只能找到处理特定警告的问题,而不是最重要的问题。

0 个答案:

没有答案