在主循环

时间:2018-02-18 18:30:53

标签: c++

我知道它不是很好,但我需要在我的程序中跨多个文件的全局变量。这些是我的图形窗口的变量:

  • 名称
  • 尺寸
  • 状态

我知道我可以创建一个.h文件并声明所有变量:

#pragma once

extern std::string GameName;
extern sf::RenderWindow Window;
extern std::string Status;

然后我想在我的main.cpp中定义我的变量,因此所有文件都可以访问这些值。但除非它们在int main()循环中,否则我无法定义它们。还有其他方法,所以我可以在主循环中定义这些变量吗?

修改

使用Visual Studio 2017。 错误:

  

LNK2001未解析的外部符号“class sf :: RenderWindow Window”   (?Window @@ 3VRenderWindow @ sf @@ A)立方体   库C:\ Users \ George \ Documents \ C ++ \ Files \ Libraries \ Cubes   Library \ Cubes Library \ Cubes Library.obj 1

  

LNK2001未解析的外部符号“类   的std :: basic_string的,类   std :: allocator>状态”   (?状态@@ 3V?$ basic_string @ DU?$ char_traits @ D @ std @@ V?$ allocator @ D @ 2 @@ std @@ A)立方体   库C:\ Users \ George \ Documents \ C ++ \ Files \ Libraries \ Cubes   Library \ Cubes Library \ Cubes Library.obj 1

  

LNK1120 2未解析的外部多维数据集   库C:\ Users \ George \ Documents \ C ++ \ Files \ Libraries \ Cubes   Library \ Debug \ Cubes Library.dll 1

3 个答案:

答案 0 :(得分:1)

您可以在main.cpp文件中声明它们,但为了使它们可以全局访问,您必须在main函数/循环之外定义它们。如果在主函数/循环中对它们进行十分转换,则它们是局部变量,并且不能(轻松)全局访问。这样做,结合你建议的头文件就可以了。

// Global variables...
std::string GameName;
sf::RenderWindow Window;
std::string Status;

int main()
{
   return 0;
}

您也可以将它们放在另一个文件中,例如globals.cpp。

答案 1 :(得分:1)

你会这样做......

文件:Main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <string>

extern std::string GameName; 
//extern sf::RenderWindow Window;
extern std::string Status;

#endif

文件:Main.cpp

#include "stdafx.h"

#include <iostream>
#include "Main.h"

std::string GameName;
//sf::RenderWindow Window; 
std::string Status;

extern void foo(); // Function Prototype

int main()
{
    GameName = "none";
    Status = "none";

    foo();

    std::cout << GameName << " - " << Status << std::endl;

    std::cout << "(HIT A KEY TO CONTINUE)" << std::endl;
    getchar();

    return 0;
}

文件:Other.cpp

#include "stdafx.h"

#include "Main.h"

void foo()
{
    // Global variables declared in Main.cpp are now accessible here
    GameName = "Horizon New Dawn";
    Status = "Finished";
}

答案 2 :(得分:1)

这是在DLL中使用全局变量的方法。

//文件:DLLGlobals.h

// This file is used in the DLL project
#ifndef __GLOBALS_H__
#define __GLOBALS_H__

#include <string>

extern "C"
{
    extern __declspec(dllexport) std::string GameName;
    extern __declspec(dllexport) std::string Status;
}

#endif//__GLOBALS_H__

//文件:DLLGlobals.cpp

#include "stdafx.h"

#include "DLLGlobals.h"

extern "C"
{
    // Define Global Variables (no C++ mangling)
    __declspec(dllexport) std::string GameName = "Dishonored 2";
    __declspec(dllexport) std::string Status = "Not Started";
}

//文件:DLL.h

#ifndef __DLL_H__
#define __DLL_H__

// This file is included by code using the DLL project
#include <string>

extern "C"
{
    __declspec(dllimport) std::string GameName;
    __declspec(dllimport) std::string Status;
}

#endif//__DLL_H__

// File:Main.cpp

#include "stdafx.h"

#include <iostream>
#include "Main.h"

#include "<path_to_dll_header>\DLL.h"

int main()
{
    std::cout << GameName << ": " << Status << std::endl;

    std::cout << "(HIT A KEY TO CONTINUE)" << std::endl;
    getchar();

    return 0;
}