c++ - 由于#define,VS2015 找不到成员函数 [c++] 定义

标签 c++ visual-studio-2015

有一个在成员函数中调用的#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/

相关文章:

C++ DLL 不会链接?

c++ - 生成没有重复的位组合(不是排列)

entity-framework - Entity Framework edmx点击图很慢

typescript - VS2015 Typescript 在保存时编译为单个文件不起作用

Python-Unicode 错误 - 'utf-8' 无法解码 .py 文件中的字节,但可以在交互环境中解码

c# - 是否可以将 Visual Studio ASP.Net 5 模板与 ASP.Net 4.6 一起使用?

c++ - Node native 模块 - 链接静态库

c++ - 一个对象的两个指针。删除了一个指针,对象还在

C++:对象和数组/循环

visual-studio-2015 - Roslyn 中的重大更改列表