我一直在努力解决如何最好地处理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以及你有什么。
最后,如果已经提出这个问题,我很抱歉,我想它已经有了,但只能找到处理特定警告的问题,而不是最重要的问题。