Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2015未找到成员函数[c+;+;]定义,原因是#define_C++_Visual Studio 2015 - Fatal编程技术网

C++ VS2015未找到成员函数[c+;+;]定义,原因是#define

C++ 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

在成员函数中调用#define。通过此定义,VS2015环境在声明级别找不到成员函数定义。项目编译和运行都很好,因此没有问题

但是,这会破坏VS2015的功能,在声明和定义之间进行跳跃

可以通过在源代码中编写#define来解决这个问题,但是不删除#define可以解决这个问题吗

文件:cFoo.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
文件: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在“查看”方面做得并不好对于宏扩展,有很多限制。例如,不能在监视窗口中使用它们,不能搜索它们扩展到的代码,等等。此代码段只是循环遍历按位整数中的每一位并执行大小写。但是,这会中断函数