如何在main函数外定义跨多文件的全局变量(VS2017)
Hey there! I get that you know global variables aren't ideal, but sometimes project requirements call for them—let's get your window-related variables (Name, Size, Status) working across multiple files without that annoying LNK2001 error.
The core issue right now is that you're defining the variables inside int main(), which makes them local to that function—other files have no way to access them. Here's how to fix this properly:
Step 1: Create a shared header file to declare the variables
First, make a header file (let's name it window_global_vars.h) that uses the extern keyword to declare your variables. This tells every file that includes this header: "Hey, these variables exist somewhere else—we'll link to their actual definition later."
// window_global_vars.h #ifndef WINDOW_GLOBAL_VARS_H #define WINDOW_GLOBAL_VARS_H // Declare the variables as external (adjust types to match your actual variables) extern std::string windowName; extern std::pair<int, int> windowSize; extern bool windowStatus; #endif // WINDOW_GLOBAL_VARS_H
The include guards (#ifndef/#define/#endif) prevent duplicate declarations if the header is included multiple times.
Step 2: Define the variables in main.cpp (outside main())
Now, in main.cpp, define the variables in the global scope (above int main()). This is where the actual memory for the variables gets allocated, and it's what the linker will look for when other files reference them.
// main.cpp #include "window_global_vars.h" // Define the global variables here (outside main()) std::string windowName = "MyMainWindow"; std::pair<int, int> windowSize = {1280, 720}; bool windowStatus = true; int main() { // You can still use these variables inside main() just like before windowName = "UpdatedAppWindow"; // ... rest of your code return 0; }
Step 3: Use the variables in other files
In any other .cpp file that needs access to these variables, just include the shared header and use them directly—no extra work needed:
// ui_utils.cpp #include "window_global_vars.h" void printWindowInfo() { if (windowStatus) { std::cout << "Active Window: " << windowName << "\nSize: " << windowSize.first << "x" << windowSize.second << std::endl; } }
Why you were getting LNK2001
When you defined the variables inside main(), they were local to that function. Other files that tried to reference them had no idea where the actual variables lived—hence the linker error about unresolved external symbols. By moving the definition to the global scope of main.cpp and using extern in the header, you're giving the linker a clear path to the actual variable definitions.
Quick note (since you know globals aren't best practice)
If you ever get the chance to refactor, consider alternatives like:
- A singleton class that holds your window state (encapsulates the variables and gives you control over access)
- Passing the window state as parameters to functions that need it (reduces coupling between files)
But for now, the above steps should get your code working smoothly in VS2017.
内容的提问来源于stack exchange,提问作者George_E -old

