想开发游戏的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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效