C++ 全局定义和范围内定义的区别

C++ 全局定义和范围内定义的区别,c++,global-variables,main,C++,Global Variables,Main,我有一个全局声明的变量。要使用它,必须定义它。根据我是全局定义它还是在主函数的范围内定义它,我会得到不同的结果 以下是基本代码: // main.cpp //int variable = 3; int main() { //int variable = 5; func(); return variable; } // source.cpp #include "source.hpp" void func() { cout << variab

我有一个全局声明的变量。要使用它,必须定义它。根据我是全局定义它还是在主函数的范围内定义它,我会得到不同的结果

以下是基本代码:

// main.cpp

//int variable = 3;

int main()
{
    //int variable = 5;

    func();

    return variable;
}

// source.cpp

#include "source.hpp"

void func()
{
    cout << variable << endl;
}

// source.hpp

#ifndef __SOURCE_HPP_INCLUDED__
#define __SOURCE_HPP_INCLUDED__

#include<iostream>
using namespace std;

extern int variable;
void func();

#endif  // __SOURCE_HPP_INCLUDED__
//main.cpp
//int变量=3;
int main()
{
//int变量=5;
func();
返回变量;
}
//source.cpp
#包括“source.hpp”
void func()
{

cout你不能在函数中定义一个全局变量。你实际上是在定义一个不同的、不相关的局部变量,而这个局部变量恰好具有相同的名称


func
引用全局变量,因此必须对其进行定义。

好的,这是因为我在标题中将其声明为全局变量。这很有意义。包含两个连续下划线的名称(
\uuuuu SOURCE\uhpp\u include\uuuu
)以下划线和大写字母开头的名称保留给实现。不要使用它们。您介意详细说明吗?您所说的“实现”是什么意思?这是“经验法则”吗或者编译器是以一种特殊的方式解析它的吗?编译器可能会专门处理它们,但主要是为了标准库(C和C++)的好处如果某些源代码使用这样的名称定义宏,并且库在头中使用相同的名称,则会收到非常奇怪的错误消息。如果对函数、类型或变量使用这样的名称,则可能会出现名称冲突。如果代码还说
使用命名空间std;
则会成倍增加这些风险。啊,明白了。谢谢你让我知道!