【发布时间】:2012-03-23 04:06:45
【问题描述】:
假设我有以下功能:
// Precondition: foo is '0' or 'MAGIC_NUMBER_4711'
// Returns: -1 if foo is '0'
// 1 if foo is 'MAGIC_NUMBER_4711'
int transmogrify(int foo) {
if (foo == 0) {
return -1;
} else if (foo == MAGIC_NUMBER_4711) {
return 1;
}
}
编译器抱怨“缺少返回语句”,但我知道foo 永远不会有与0 或MAGIC_NUMBER_4711 不同的值,否则我的函数将没有定义的语义。
对此有什么更好的解决方案? 这真的是一个问题吗,即标准是怎么说的?
【问题讨论】:
-
尽管我自己回答了这个问题,但我仍会坚持更多解决方案和强制性标准参考。
-
".. 我知道 foo 的值永远不会不同于 0 或 MAGIC_NUMBER_4711。"我无法从您发布的代码中看出这一点。您为什么希望编译器能够做到?
-
@Fred:他不希望编译器能够做到这一点,他只是不希望它发出正确代码的警告。
-
@SteveJessop:我认为它是“符合标准的”意义上的“正确代码”,但如果输入与您预期的不同,则会给出未定义的行为。”
-
@Fred:确切地说,它是“正确的”,就像在 glibc 中实现
strlen是“正确的”:某些输入会导致未定义的行为,而这些输入对于程序员来说是已知的(通过文档)。取决于可能或可能不“足够正确”的项目,但通常是。
标签: c++