想开发游戏的Wang 2022-02-22 17:27 采纳率: 90%
浏览 41
已结题

C++在.h头文件中命名空间中定义变量,为什么没有出现重定义的错误,而且在其他.cpp文件里也不能使用?

//.h文件
#pragma once
#include <iostream>
using namespace std;

namespace test1 {
    int make;
    void func();
}

namespace test2 {
    void func();
}


//test.cpp文件
#include <iostream>
#include "test.h"

void test1::func()
{
    std::cout << "func" << std::endl;
}

命名空间.cpp文件
#include<iostream>
#include"test.h"
using namespace std;

//2.
namespace A {
    int a;
    namespace B {
        int b;
    }
}

//3.
namespace A {
    int c;
}

//5.
void test()
{
    namespace C = A;
}

int a;

int main()
{
    int a;
    test1::func(); //6.
    
    return 0;
}

若我要在命名空间.cpp文件中使用.h文件中的make时,错误提示是test1命名空间中不包含make,但是我在定义make后编译时,也没有提示重定义的问题?

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-02-22 18:59
    关注

    一般来说不能在头文件里定义变量,因为头文件很可能被不同的cpp文件包含多次,这样就导致了该变量被多次定义,违背ODR (One Definition Rule)。
    但你可以在头文件里声明该变量,即在前面加上extern,然后在其中一个cpp文件里定义该变量,这样这个变量只有一个定义,符合ODR。
    https://en.cppreference.com/w/cpp/language/definition

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月22日
  • 创建了问题 2月22日

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考