我有一些看起来像这样的代码:
someFunc(value)
{
switch(value){
case 1:
case 2:
case 3:
#ifdef SOMEMACRO
case 4:
case 5:
#endif
return TRUE;
}
return FALSE;
}
定义SOMEMACRO,假设值为4 ..为什么跳过案例4和5而返回FALSE? :(
是因为我没有默认情况,或者我不允许在switch语句中使用ifdef?
答案 0 :(得分:8)
尝试以下方法:
someFunc(value)
{
switch(value){
case 1:
case 2:
case 3:
#ifdef SOMEMACRO
#error macro is defined
case 4:
case 5:
#else
#error macro is not defined
#endif
return TRUE;
}
return FALSE;
}
编译它,看看编译器给你的两个错误中的哪一个。
答案 1 :(得分:3)
您没有指定您正在使用的编译器/预编译器,但大多数都有保留预处理器结果的选项 - 我要检查的第一件事就是在那里生成的内容。
不可否认,我更愿意维护看起来更像这样的代码:
someFunc(value)
{
switch(value){
case 1:
case 2:
case 3:
return TRUE;
#ifdef SOMEMACRO
// Special build for SOMEMACRO Inc.
case 4:
case 5:
return TRUE;
#endif
default:
return FALSE;
}
}
答案 2 :(得分:2)
根据您的编译器,您应该有一种方法来阅读和检查预处理的代码。通过这种方式,您无需从远处猜测和捅它,并且可以看到您要求编译器编译的确切代码。使用gcc,the relevant option is -E。
答案 3 :(得分:2)
“开关”没有损坏
to,或多或少,引用The Pragmatic Programmer。
继续前往其他地方寻找错误。要说服自己在someFunc中添加value = 4
和#define SOMEMACRO
。
进行干净的构建以确保每个依赖都得到解决。
答案 4 :(得分:1)
您确定在定义SOMEMACRO之后编译了您的模块吗?
答案 5 :(得分:0)
为什么不在默认情况下输入“return false”?
答案 6 :(得分:0)
您的假设中的某些内容不正确,请更改代码并从那里开始向后工作。
#define SOMEMACRO 1
someFunc(value)
{
value = 4;
switch(value){
case 1:
case 2:
case 3:
#ifdef SOMEMACRO
case 4:
case 5:
#endif
return TRUE;
}
return FALSE;
}
如果这不能恢复,你就会遇到真正的问题。
答案 7 :(得分:0)
其他人已经指定了如何检查是否定义了宏。
如果构建系统正在定义宏,那么找到它的好方法是:将构建输出传递给grep(或类似的文本搜索工具)以搜索宏定义(类似于:make | grep "-DSOMEMACRO"
)。
如果您的系统上没有grep;将构建输出重定向到文件并在文本编辑器中打开它,以使用文本搜索手动检查。)
答案 8 :(得分:0)
与其他人一样,我认为你的一个假设必定是不正确的。您没有说明您正在使用哪个编译器,但如果它是MS Visual C ++,请尝试将以下内容放在#ifdef中以验证SOMEMACRO确实 已定义。
#ifdef SOMEMACRO
#pragma message("SOMEMACRO is defined")
case 4:
case 5:
#endif