在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见

Declare variable in namespace, define it in main, make it visible to all other files

本文关键字:其他 文件 声明 命名空间 变量 main 定义      更新时间:2023-10-16

使用 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;
}
}