extern 变量导致多重定义错误

2023-11-29

我一直在尝试使用 extern 来使用先前定义的变量。

我以前没有使用过 extern,现在我需要使用它来定义一次变量并在多个文件中使用它们

我已经为这个问题编写了最小化的代码版本。我有四个文件

lib.h

#ifndef LIB_H
#define LIB_H

#include <iostream>

namespace lib {

  extern bool initialized;

  bool initialized = false;

  static void isInit(char* parent) {
    std::cout << "Library for [" << parent << "] initialized? " << (::lib::initialized ? "yes" : "no") << "\n";
  }
} // namespace lib
#endif

车辆.h

#ifndef _VEHICLE_H
#define _VEHICLE_H
#include <string>

class Vehicle {
  public:
    Vehicle(const std::string& manufacturer,
            const std::string& model,
            int year);
    std::string manufacturer;
    std::string model;
    int year; 
};
#endif

以下是名为vehicle.cpp的vehicle.h文件的实现

#include "vehicle.h"

#include "lib.h"

Vehicle::Vehicle(const std::string& manufacturer,
                 const std::string& model,
                 int year) :
                    manufacturer(manufacturer),
                    model(model),
                    year(year) {
   ::lib::isInit("Vehicle");
}

main.cpp

#include "vehicle.h"

#include "lib.h"

int main(int argc, char** argv) {

   ::lib::isInit("main");

   ::lib::initialized = true;

   ::lib::isInit("main");

   Vehicle vehicle("Toyota", "Corolla", 2013);

   return 0;
}

我正在使用 g++

g++ -Wno-write-strings main.cpp vehicle.cpp -o bin/main.cpp.bin 

我收到以下错误:

/tmp/cclVpsgT.o:(.bss+0x0): multiple definition of `lib::initialized'
/tmp/ccmJKImL.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

我检查了以下输出:

g++ -Wno-write-strings main.cpp vehicle.cpp -E

每次包含 lib.h 时都会发生多个定义。

我的问题是:

  • 为什么当定义保护存在时 lib.h 会被多次包含
  • 我将如何定义“extern”变量并在同一个文件中初始化它(因为它稍后在同一个文件中使用)

Why is lib.h当定义守卫存在时包含多次

您需要删除定义:

bool initialized = false;

并将其放入唯一的一个源文件中。

包含防护可防止同一头文件多次包含在同一头文件中翻译单位(TU)不在不同的翻译单元中。
您定义变量initialized在头文件中,它被包含在不同的翻译单元中,然后每个 TU 都有一个名为initialized这打破了一个定义规则.

我将如何定义“extern”变量并在同一个文件中初始化它(因为它稍后在同一个文件中使用)

如果您希望变量在同一个文件中使用,为什么要这样做extern?你需要使用extern当您想要在不同的 TU 之间共享相同的变量时。
如果您需要在全局范围内仅在单个 TU 中使用它,您应该简单地将其放入未命名的命名空间.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

extern 变量导致多重定义错误 的相关文章

随机推荐

  • 使用 Vanilla Javascript 检测滚动以帮助更改导航 CSS [重复]

    这个问题在这里已经有答案了 我试图检测页面上的滚动是否超过高度为 80 像素的固定顶部导航的 100 像素 计划是 一旦用户的滚动超过上述 100 像素 导航栏将更改背景颜色 我看过很多关于这个主题的教程 但我看到的所有教程都是使用 Jqu
  • 在元素上使用重复的类名?

    我发现有很多框架会在元素上添加新类名之前检查重复的类名 我认为这会降低性能 当元素有重复的类名时会出现问题吗 当使用重复的类名时 它还会应用 CSS 类 而不会发生冲突 div class aa bb cc aa div 可以简单地添加一个
  • 创建计算器(JS)

    我有一条线calc 2 add 3 add 5 res 并需要写一个解决方案 以便我有10因此 我试过这个 class Calc constructor num this num num add a this num a return th
  • 带有自定义滚动条的自动完成 jquery UI 插件

    有人尝试为 jquery UI 自动完成小部件制作自定义滚动条吗 我正在尝试将 jScrollPane jquery 组件与自动完成小部件结合使用 但到目前为止没有取得任何成功 如果有人知道一些带有自定义滚动条的 jquery 自动完成组件
  • 将循环放入 C 宏中

    我正在寻找一种将以下函数结构转换为宏的方法 我知道 这是一个愚蠢且毫无意义的例子 但它说明了这一点 因为我无法给出我的实际源代码 int foo int x int y do x y while x gt y return x y note
  • 使用新数据重新渲染漏斗高图

    我在 MVC3 应用程序中使用 highcharts 并且在数据修改后尝试刷新 但图表不刷新 我绘制的图表如下 function initializeChart chart1 new Highcharts Chart chart rende
  • 使用 Apache FTPClient 检索文件时如何保留修改日期?

    我在用org apache commons net ftp FTPClient用于从 ftp 服务器检索文件 当文件保存在我的计算机上时 保留文件上最后修改的时间戳至关重要 有人对如何解决这个问题有建议吗 这就是我解决它的方法 public
  • 不正确的位图复制/输出

    因此 我在尝试读取任何 24bpp 位图图像并在同一文件夹中重新创建它时 无法准确弄清楚到底出了什么问题 它适用于一张图像 但不适用于我测试过的其他两张图像 从位图中读取时 我使用标头本身中找到的信息 可以说我有三个问题 1 我是否正确读取
  • Maven 通配符匹配部分文件夹名称

    使用 maven clean plugin 我想删除所有以 tmp 开头的文件夹 Maven 通配符可以吗 我努力了
  • 该程序创建了多少个进程,包括初始父进程?

    我试图弄清楚该程序创建了多少个进程 包括初始父进程 正确答案应该是9 但是我不明白为什么答案是9 这9个进程是如何创建的 提前致谢 include
  • 是否有有效的跨域 iframe 高度自动调整器?

    我尝试了一些解决方案但没有成功 我想知道是否有一个解决方案 最好有一个易于遵循的教程 您有三种选择 1 使用iFrame调整器 这是一个简单的库 用于保持 iFrame 的大小适合其内容 它使用 PostMessage 和 Mutation
  • 为应用程序制作密码锁?

    我想为我的应用程序制作一个密码解锁屏幕 但我不确定如何去做 我希望它看起来像苹果设计的版本 即密码锁定设置屏幕 我该如何做这样的事情 一旦输入所有四位数字 代码就会立即与预设密码进行检查 Thanks 刚刚找到一个可以完美复制这一点的项目
  • J2ME 与 Sqlite

    J2me的移动应用程序是否有像SQLite这样的持久存储 如果有 请分享链接或一些示例代码 使简单的 J2ME 应用程序与后端持久数据库进行交互 是的 J2ME 有持久存储 称为 RMS MIDP 2 0 的一部分 看这里简短的教程 RMS
  • 旋转前后的 OpenGL 平移

    以下是代码 摘自http www glprogramming com red chapter03 html 关于如何绘制机器人的手臂和肩膀并通过一些用户输入旋转它们 glPushMatrix glTranslatef 1 0 0 0 0 0
  • 如何使用 OpenCV(模板匹配)检测和匹配标记

    我正在使用在特定区域包含标记的图像 我尝试使用模板匹配来做到这一点 这是 opencv 中定义为 cv MatchTemplate 的方法 我正在使用网络摄像头来检测它们 当前程序正在检测标记 因为我提供了与模板相同的标记 但我找不到一种方
  • 将对象添加到 ArrayList 并稍后修改

    如果我有一个 ArrayList 并向其中添加了一个对象 然后修改了该对象 那么此更改会反映在 ArrayList 中吗 或者当我将对象添加到 ArrayList 时 Java 创建一个副本并将其添加到 ArrayList 中 如果我将此对
  • Android 查看 inflateException

    我正在尝试创建一个自定义视图 手指绘画 但我遇到了此错误 而且我不知道如何修复它 谁能告诉我出了什么问题吗 LogCat 08 04 08 34 01 171 E AndroidRuntime 15664 java lang Runtime
  • python firestore 身份验证问题

    我正在将 python 与 firestore 一起使用 并尝试在后端创建一个客户端 我正在关注this教程 用下面的代码 import firebase admin from firebase admin import credentia
  • 从 SQLite 触发器中中止以下语句

    我想创建一个SQLite触发器与此类似 CREATE TRIGGER prevent duplicate emails BEFORE INSERT OF email ON users FOR EACH ROW BEGIN SELECT CO
  • extern 变量导致多重定义错误

    我一直在尝试使用 extern 来使用先前定义的变量 我以前没有使用过 extern 现在我需要使用它来定义一次变量并在多个文件中使用它们 我已经为这个问题编写了最小化的代码版本 我有四个文件 lib h ifndef LIB H defi