C++ VS2015未找到成员函数[c+;+;]定义,原因是#define
在成员函数中调用#define。通过此定义,VS2015环境在声明级别找不到成员函数定义。项目编译和运行都很好,因此没有问题 但是,这会破坏VS2015的功能,在声明和定义之间进行跳跃 可以通过在源代码中编写#define来解决这个问题,但是不删除#define可以解决这个问题吗 文件:cFoo.hC++ VS2015未找到成员函数[c+;+;]定义,原因是#define,c++,visual-studio-2015,C++,Visual Studio 2015,在成员函数中调用#define。通过此定义,VS2015环境在声明级别找不到成员函数定义。项目编译和运行都很好,因此没有问题 但是,这会破坏VS2015的功能,在声明和定义之间进行跳跃 可以通过在源代码中编写#define来解决这个问题,但是不删除#define可以解决这个问题吗 文件:cFoo.h class cFoo { public: int Bits; void Member(); } #ifndef FOO_H #define FOO_H #ifndef SWITC
class cFoo
{
public:
int Bits;
void Member();
}
#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
文件: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;
}
}
#include "Foo.h"
void Foo::Member() {
SWITCH( this->Bits );
}
您可以通过在
#define
-宏中完成switch语句来尝试执行此操作:
Foo.h
class cFoo
{
public:
int Bits;
void Member();
}
#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 "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;
}
}
#include "Foo.h"
void Foo::Member() {
SWITCH( this->Bits );
}
当我尝试使用#define
或宏时,Foo::Member()
不是由intellisense定义的
然而,即使没有定义它,我也能够像这样构建、编译和运行它:
#ifndef SWITCH_A
#define SWITCH_A(x) \
for ( int bit = 1; (x) >= bit; bit *= 2 ) \
if ( (x) & bit ) \
switch (bit)
#endif
出于某种原因;微软VisualStudio对此非常挑剔;这意味着我很难将其编译;它甚至抱怨“间隔”给了我缺失{
或;需要在…
之前等编译器错误。一旦我正确地减小了所有间隔,它最终编译并运行了,但intellisense无法看到Foo::Member()
已定义。当我以上面所示的原始方式尝试它时,intellisense可以看到Foo::Member()
已定义。不知道这是否是预编译错误、MS Visual Studio错误等;希望这对您有所帮助。您可以通过在\define
-宏中完成switch语句来尝试执行此操作:
Foo.h
class cFoo
{
public:
int Bits;
void Member();
}
#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 "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;
}
}
#include "Foo.h"
void Foo::Member() {
SWITCH( this->Bits );
}
当我尝试使用#define
或宏时,Foo::Member()
不是由intellisense定义的
然而,即使没有定义它,我也能够像这样构建、编译和运行它:
#ifndef SWITCH_A
#define SWITCH_A(x) \
for ( int bit = 1; (x) >= bit; bit *= 2 ) \
if ( (x) & bit ) \
switch (bit)
#endif
出于某种原因;微软Visual Studio对它非常挑剔;这意味着我很难让它编译;它甚至抱怨“间隔”给了我缺失的编译器错误{
或之前需要…
等。一旦我把所有的间隔正确地放下来,它最终编译并运行了,但是intellisense无法看到Foo::Member()
是定义的。当我以上面所示的原始方式尝试时,intellisense没有问题看到Foo::Member()
已定义。不知道这是否是预编译错误、MS Visual Studio错误等;只希望这对您有所帮助。我不建议使用此类构造。这相当违反直觉且难以理解
可能的问题/困难:
- 带中断的开关case表示只执行一个case,但宏逻辑隐藏了循环
- 默认情况下,根据填充的最高位执行多次
- 使用
signed int
作为位集->使用unsigned
——不太容易出现实现定义的行为
- 它可能因为循环而变慢(我不知道编译器是否能够展开并优化它)
- 它被称为
SWITCH\u 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){
}
inline bool-isBitSet(u32 i_-bitset,u32 i_-bit){返回i_-bitset&(1我不建议使用这样的结构。这很违反直觉,也很难理解
可能的问题/困难:
- 带中断的开关case表示只执行一个case,但宏逻辑隐藏了循环
- 默认情况下,根据填充的最高位执行多次
- 使用
signed int
作为位集->使用unsigned
——不太容易出现实现定义的行为
- 它可能因为循环而变慢(我不知道编译器是否能够展开并优化它)
- 它被称为
SWITCH\u 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){
}
inline bool-isBitSet(u32 i_-bitset,u32 i_-bit){return i_-bitset&(1 A#define是一个“预处理器宏”,不是一个函数,所以它没有被调用,它是经过文本扩展的。我不太确定你想做什么,但VS Intellisense在“查看”方面做得并不好对于宏扩展,有很多限制。例如,不能在监视窗口中使用它们,不能搜索它们扩展到的代码,等等。此代码段只是循环遍历按位整数中的每一位并执行大小写。但是,这会破坏VS2015的功能,在声明和定义之间跳转。声明和什么定义?成员函数?如果是真的,那就很奇怪了。作为旁注,请检查std::bitset以了解位操作需要。通常将宏“调用”称为。在这种特殊情况下,最好用接受可调用对象的模板函数替换宏。define是一个“预处理器宏”,不是一个函数,所以它没有被调用,它是文本扩展的。我不确定你想做什么,但是VS Intellisense在“查看”方面做得并不好对于宏扩展,有很多限制。例如,不能在监视窗口中使用它们,不能搜索它们扩展到的代码,等等。此代码段只是循环遍历按位整数中的每一位并执行大小写。但是,这会中断函数