假设您的头文件中有一个静态全局变量,并在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 ++中初始化静态字符串成员时遇到了一些问题.我有几个类,每个类都有几个代表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".
我正在努力让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)
我的问题是,他们是否有任何理由这样设置?它会在其他平台上正确编译吗?
无法理解这里有什么问题:我有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文件中可以保护我免受这种链接问题的影响.
我想将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) 这个关于头文件和源文件的答案说:
编译器会看到一个大的源(.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和plain函数,我可以使用static关键字阻止函数的符号输出:
static int foo(int a, int b) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
但在一个类中,定义一个函数static具有完全不同的含义.有没有办法确保编译器我的整个类只能在模块中使用,而且不需要导出它的任何方法的符号?
我尝试查找这个并使用头文件等获得混合结果.
基本上我有多个cpp文件,其中包含我用于二叉树,BST,链表等的所有功能.
我想要做的不是必须复制和粘贴函数,因为我需要它们,我希望能够做到
#include <myBSTFunctions.h>
Run Code Online (Sandbox Code Playgroud)
并能够调用和使用我自己的功能.
完成此任务的步骤是什么?使用我使用的所有函数原型制作头文件?在哪里使用所有实际功能来放置cpp和头文件?有没有办法可以直接调用函数文件的目录?
即我更想把它与主源cpp文件放在同一个文件夹中,与我的一些同事分享.
我怎么能做到这一点?
编辑:Windows.miniGW编译器
我有以下类,方法签名如下:
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"之外,有没有更好的方法来执行上述操作,为什么编译器不能在此实例中推断出返回类型?或者甚至,它是否依赖于如何调用此方法导致编译器无法确定返回类型.
头文件是翻译单元吗?如果我将 static 关键字添加到头文件中的变量中,我可以在 .c 或 .cpp 文件中调用该变量吗?谢谢。