相关疑难解决方法(0)

每个文件都有自己的静态变量副本吗?

假设您的头文件中有一个静态全局变量,并在main.cpp中使用此变量.

// header.h
static int variableOne = 100;

//main.cpp
   .
   .
   cout << variableOne << endl;
Run Code Online (Sandbox Code Playgroud)

main.cpp会得到自己的variableOne副本(虽然值仍然是100 ......)?或者我将这个概念与extern混合(我知道extern告诉编译器,variableOne是在项目的其他地方定义的......)

谢谢.

c++

2
推荐指数
2
解决办法
196
查看次数

c ++:初始化静态字符串成员

我在c ++中初始化静态字符串成员时遇到了一些问题.我有几个类,每个类都有几个代表id的静态字符串成员.当我通过调用静态函数初始化变量时,一切都很好.但是,当我想要为另一个变量赋值时,它仍然保留空字符串.这段代码有什么问题?

std::string A::id()
{
    std::stringstream sst; 
    sst << "id" << i;           
    i++;
    return sst.str();
}

  std::string B::str = A::id(); //prints "id0";
  std::string C::str = "str"; //prints str


  std::string D::str = B::str; //prints "" <-- what's wrong here?
  std::string D::str2 = C::str; //prints ""
Run Code Online (Sandbox Code Playgroud)

似乎我所引用的变量(B :: str和C :: str)尚未初始化.但我假设当执行D :: str = B :: str时C :: str最迟被初始化,因此D :: str也应该保存字符串"id0".

c++ string static

1
推荐指数
1
解决办法
2259
查看次数

extern函数原型和静态定义

我正在努力让FreeGLUT在OSX上构建,并且遇到了同样问题的许多实例.许多功能仅存在于.c文件中.

这是一个例子

extern void fghRestoreState( void );

static void fghRestoreState( void ){...}
Run Code Online (Sandbox Code Playgroud)

我对C的理解有限,但编译器错误似乎有意义:

src/Common/freeglut_gamemode.c:252: error: static declaration of ‘fghRestoreState’ follows non-static declaration
src/Common/freeglut_gamemode.c:43: error: previous declaration of ‘fghRestoreState’ was here
Run Code Online (Sandbox Code Playgroud)

我的问题是,他们是否有任何理由这样设置?它会在其他平台上正确编译吗?

c macos gcc freeglut

1
推荐指数
1
解决办法
3169
查看次数

链接错误(#ifndef无法按预期工作)

无法理解这里有什么问题:我有main.cpp文件,其中包括:

#include "lexan.h"
...
Run Code Online (Sandbox Code Playgroud)

lexan.h文件:

#ifndef _LEXAN_
#define _LEXAN_
enum Statements ...
//some function prototypes
...
struct TokensList {
    Statements statement;
    std::string value;
    struct TokensList *next;
};
struct TokensList *tokens = NULL;
#endif _LEXAN_
Run Code Online (Sandbox Code Playgroud)

在lexan2.h中:

#include "lexan.h"
// and some function prototypes
Run Code Online (Sandbox Code Playgroud)

问题是我得到链接错误2005:

1>lexan2.obj : error LNK2005: "struct TokensList * tokens" (?tokens@@3PAUTokensList@@A) already defined in lexan.obj
1>main.obj : error LNK2005: "struct TokensList * tokens" (?tokens@@3PAUTokensList@@A) already defined in lexan.obj
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?我以为

#ifndef _LEXAN_
#define _LEXAN_
Run Code Online (Sandbox Code Playgroud)

在lexan.h文件中可以保护我免受这种链接问题的影响.

c++

1
推荐指数
1
解决办法
1113
查看次数

无法定义类函数OUTSIDE类

我想将Game类分为标题和源代码.要做到这一点,我需要能够在类外定义函数,但奇怪的是,我不能!

main.cpp中

#include "app.hpp"
int main ()
{
    Game game(640, 480, "Snake");
    game.run();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

app.hpp

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
class App
{
    friend class Game;
    public:
             App(const int X, const int Y, const char* NAME);
        void run(void);
    private: // Variables
        sf::RenderWindow window;
        sf::Event         event;
        sf::Keyboard     kboard;
};
#include "game.hpp"
Run Code Online (Sandbox Code Playgroud)

现在问题部分.

game.hpp.

class Game // this snippet works perfectly
{
    public:
             Game(const int X, const int Y, const char* TITLE) : app(X, Y, TITLE)
             { /* and the …
Run Code Online (Sandbox Code Playgroud)

c++ layout class multiple-definition-error

1
推荐指数
1
解决办法
161
查看次数

包含标题后显示生成的c/c ++文件(在转换为机器语言之前)

这个关于头文件和源文件的答案说:

编译器会看到一个大的源(.cpp)文件及其正确包含的标头.源文件是将编译为目标文件的编译单元.

有可能以某种方式查看这个大的.cpp(.c)文件吗?如果是,那么如何在Linux(gcc)和Windows(VisualStudio)平台上执行此操作.

PS:我已经试过在Visual Studio/P选项(关于Solution Explorer中,转到属性的文件上单击右键;配置属性- > C/C++ - >预处理器- >预处理到文件- > [YES/P] )但是我已经获得了几个*.i文件,这些文件看起来不像c ++(可能是c ++,但有许多模板,内存分配定义等).我所指的答案是谈论"一个大的.cpp文件".所以我假设只有#include指令会被相应的文件替换,或者我错了,*.i输出是我被要求的?

c c++

1
推荐指数
1
解决办法
659
查看次数

控制符号可见性的标准方法

在C++中使用C和plain函数,我可以使用static关键字阻止函数的符号输出:

static int foo(int a, int b) { /* ...  */ }
Run Code Online (Sandbox Code Playgroud)

但在一个类中,定义一个函数static具有完全不同的含义.有没有办法确保编译器我的整个类只能在模块中使用,而且不需要导出它的任何方法的符号?

c++ c++14

1
推荐指数
2
解决办法
104
查看次数

如何从另一个.cpp文件中的一个.cpp文件调用函数?

我尝试查找这个并使用头文件等获得混合结果.

基本上我有多个cpp文件,其中包含我用于二叉树,BST,链表等的所有功能.

我想要做的不是必须复制和粘贴函数,因为我需要它们,我希望能够做到

#include <myBSTFunctions.h> 
Run Code Online (Sandbox Code Playgroud)

并能够调用和使用我自己的功能.

完成此任务的步骤是什么?使用我使用的所有函数原型制作头文件?在哪里使用所有实际功能来放置cpp和头文件?有没有办法可以直接调用函数文件的目录?

即我更想把它与主源cpp文件放在同一个文件夹中,与我的一些同事分享.

我怎么能做到这一点?

编辑:Windows.miniGW编译器

c++

1
推荐指数
3
解决办法
8156
查看次数

如何缩短此方法签名?

我有以下类,方法签名如下:

class Foo
{
    public:
        std::vector<std::string> barResults(const std::vector<std::string>&, const std::vector<std::string>&);
}
Run Code Online (Sandbox Code Playgroud)

在实现文件中,我有这个:

std::vector<std::string> Foo::barResults(const std::vector<std::string>& list1, const std::vector<std::string>& list2)
{
    std::vector<std::string> results;
    // small amount of implementation here...
    return results;
}
Run Code Online (Sandbox Code Playgroud)

所以我想,让我们看看我是否可以通过一些自动魔法来简化这个功能签名,因为它会变成一个"满满一行"!所以我试过这个......

class Foo
{
    public:
        auto barResults(const std::vector<std::string>&, const std::vector<std::string>&);
}

auto Foo::barResults(const std::vector<std::string>& list1, const std::vector<std::string>& list2)
{
    std::vector<std::string> results;
    // small amount of implementation here...
    return results;
}
Run Code Online (Sandbox Code Playgroud)

现在忽略了这样一个事实:是的,我可以使用"使用命名空间std"来修剪它,我想知道为什么编译器给了我一个错误"返回'auto'的函数在定义之前不能使用".

我个人原本会认为编译器很容易推断出该方法的返回类型,但在这种情况下它似乎并非如此.当然,您可以使用尾随返回类型修复它,如下所示:

class Foo
{
    public:
        std::vector<std::string> barResults(const std::vector<std::string>&, const std::vector<std::string>&) -> std::vector<std::string>;
}
Run Code Online (Sandbox Code Playgroud)

但是如果你使用上面的话,那就不比以前好了.因此,除了"使用命名空间std"之外,有没有更好的方法来执行上述操作,为什么编译器不能在此实例中推断出返回类型?或者甚至,它是否依赖于如何调用此方法导致编译器无法确定返回类型.

c++ c++11

0
推荐指数
1
解决办法
108
查看次数

头文件是翻译单元吗?

头文件是翻译单元吗?如果我将 static 关键字添加到头文件中的变量中,我可以在 .c 或 .cpp 文件中调用该变量吗?谢谢。

c c++ file header-files translation-unit

0
推荐指数
1
解决办法
144
查看次数