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

时间:2018-01-17 06:53:12

标签: 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;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以通过在#define - macro中完成切换语句来尝试这样做:

<强> foo.h中

#ifndef FOO_H
#define FOO_H

#ifndef SWITCH
    #define SWITCH(x)                                   \
        do {                                            \
            for ( int bit = 1; (x) >= bit; bit *=2 ) {  \
                if ( (x) & bit ) {                      \
                    switch( bit ) {                     \
                         case 0: break;                 \
                         case 1: break;                 \
                         default: break;                \
                     }                                  \
                }                                       \
            }                                           \
        } while(0)
#endif

class Foo {
public:
    int Bits;
    void Member();
};

#endif // !FOO_H

<强> Foo.cpp中

#include "Foo.h"

void Foo::Member() {
    SWITCH( this->Bits );
}

当我尝试使用#definemacro时,Foo::Member() 没有被intellisense定义......

然而即使没有定义它我也能够像这样构建,编译和运行它:

#ifndef SWITCH_A
    #define SWITCH_A(x)                             \
        for ( int bit = 1; (x) >= bit; bit *= 2 )   \
            if ( (x) & bit )                        \
                switch (bit) 
#endif

出于某种原因; MS Visual Studio对它非常挑剔;这意味着我很难将其编译;它甚至抱怨&#34;间距&#34;给我missing {; need before...等编译器错误。一旦我正确地将所有间距缩小,它最终会编译和放大运行,但intellisense无法看到Foo::Member()被定义。当我以我上面所示的原始方式尝试时; intellisense看到Foo::Member()被定义没有问题。不知道它是否是预编译器错误,MS Visual Studio bug等;希望这对你有帮助。

答案 1 :(得分:2)

我不赞成使用这样的结构。这是违反直觉的,难以理解。

可能存在的问题/困难:

  • 带有中断的switch case表示只执行了一个case,但是你的宏逻辑隐藏了循环。
  • 根据最高填充位执行多次默认情况。
  • 使用signed int作为位集 - &gt;使用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){
}