有一个在成员函数中调用的#define。通过这个#define,VS2015 环境在声明级别找不到成员函数定义。该项目编译并运行得很好,所以没有问题。
但是,这会破坏 VS2015 在声明和定义之间跳转的功能。
在源代码中写#define可以解决,但是不去掉#define能解决吗?
文件:cFoo.h
class cFoo
{
public:
int Bits;
void Member();
}
文件:cFoo.cpp
#include "cFoo.h"
#define SWITCH( x ) for ( int bit = 1; x >= bit; bit *= 2) if (x & bit) switch (bit)
void cFoo::Member()
{
SWITCH( Bits )
{
case 1: break;
case 2: break;
default: break;
}
}
最佳答案
我不建议使用这样的结构。这是相当违反直觉和难以理解的。
可能遇到的问题/困难:
- 带 break 的 switch case 表明只执行了一个 case,但你的宏逻辑隐藏了循环。
- 默认情况会根据填充的最高位执行多次。
- 使用
signed int
作为位集 -> 使用unsigned
- 它不太容易出现实现定义的行为 - 可能因为循环比较慢(不知道编译器能不能展开优化)
- 它称为
SWITCH_BITS
,这表明位数是预期的,但大小写必须是 2 的幂。
您的整个语句并不比简单的 if
序列更紧凑。
if(bits & 1 ){
}
if(bits & 1024){
}
但您可能想测试位数:
inline bool isBitSet(u32 i_bitset, u32 i_bit){ return i_bitset & (1 << i_bit);}
if(isBitSet(bits, 0){
}
if(isBitSet(bits, 10){
}
关于c++ - 由于#define,VS2015 找不到成员函数 [c++] 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48295208/