在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
Declare variable in namespace, define it in main, make it visible to all other files
使用 C++14,我尝试在存储常用变量的命名空间中定义一个变量 (App::Common(。main 函数应该是设置它的函数,因为它被设置为 argv[0]。同时,我需要该变量对所有其他类/文件可见。但是我收到如下所示的链接器错误。此外,理想情况下,我希望变量是 const,只有 main 函数会设置一次。
普通.hpp
#pragma once
#include <string>
namespace App{
namespace Common{
extern std::string appPath;
}
}
主.cpp
#include "common.hpp"
#include "client.hpp"
#include <string>
int main() {
App::Common::appPath = argv[0];
}
客户端.hpp
#include "common.hpp"
class Client {
public:
void printAppPath();
};
客户端.cpp
#include <iostream>
#include <string>
#include "common.hpp"
#include "client.hpp"
void Client::printAppPath() {
std::cout << App::Common::appPath << std::endl;
}
我通过链接器收到以下错误:
ld: main.o: in function `main':
main.cpp:(.text.startup.main+0x25): undefined reference to `App::Common::appPath[abi:cxx11]'
ld: Client.o: in function `Client::printAppPath()':
Client.cpp:(.text...): undefined reference to `App::Common::appPath[abi:cxx11]'
#pragma once
#include <string>
namespace App{
namespace Common{
extern std::string appPath;
}
}
仅包含变量appPath
的声明,而不包含其定义。
这里
#include "common.hpp"
#include "client.hpp"
#include <string>
int main() {
App::Common::appPath = argv[0];
}
使用赋值运算符将变量appPath
赋值 TP,就好像它已经定义过一样。然而,实际上它的定义还不存在。
可以在命名空间 Common 的任何封闭命名空间中的任何模块中或在命名空间内定义变量。例如,您可以在客户端中定义它.cpp例如
std::string App::Common::appPth;
您混合了定义和赋值,这是变量的两种不同内容:
- 变量的声明
x
告诉您的编译器某处存在一个名为x
的变量; - 变量的定义
x
告诉你的编译器,它需要为这个变量x
保留一些空间,并且变量x
将驻留在这个位置;
赋值 - 为变量赋值。
对于变量,声明通常是一个定义:
void foo() {
int a; // Declaration AND Definition!
}
。除非变量被标记为extern
,因为extern
明确告诉编译器这个变量是在别处定义的。在您的情况下,这:
namespace App::Common { // C++17 style
extern std::string appPath;
}
。是一个声明,但是这个:
namespace App::Common { // C++17 style
std::string appPath;
}
。将是一个定义(也是一个声明(,并且:
int main(int argc, char *argv[]) {
App::Common::appPath = std::string(argv[0]);
}
。是一个作业。
您不应该在标头中定义appPath
,例如common.hpp
, otherwize,您将对同一变量有多个定义(每个包含common.hpp
的.cpp
文件一个(,并且程序将无法编译。
你想要的是程序的单个定义,获取它的唯一方法是在.cpp
文件中一劳永逸地定义App::Common::appPath
。如果需要,可以在main.cpp
中定义它:
#include <string>
#include "common.hpp"
#include "client.hpp"
// Definition:
std::string App::Common::appPath;
int main() {
// Assignment:
App::Common::appPath = argv[0];
}
你需要定义:
共同点.cpp:
namespace App{
namespace Common{
std::string appPath;
}
}
相关文章:
- 在其他文件中创建类时在 c++ 项目中不起作用
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 如何在其他文件中使用函数
- C++ - 忽略并从其他文件获取数据
- 无法使用 CMake 从其他文件夹添加源文件
- 从文件中查找单词并替换到其他文件中
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 不能在其他文件中包含结构
- 如何在不受其他文件影响的情况下"by itself" Visual Studio 项目中运行C++文件?
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 包含并运行来自其他文件的函数
- C++不能使用其他文件中的类
- C++ 将问题包含在其他文件中?(提升包括)
- 如何在 CMake 中构建其他文件夹
- 如何使用所有其他文件信息来编译代码,例如HAAR级联训练的权重的XML文件
- 如何在其他文件中使用主文件的场景对象
- 获取对源文件中特定函数的所有调用并生成其他文件(使用 C、C++预处理器或脚本)
- 如何将文件打印到其他文件夹
- 使用 Select 多路复用未命名的管道和其他文件描述符