在成员函数中调用#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;
}
}
答案 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 );
}
当我尝试使用#define
或macro
时,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)
我不赞成使用这样的结构。这是违反直觉的,难以理解。
可能存在的问题/困难:
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){
}