【问题标题】:Difference between defining globally and within scope全局定义和范围内定义的区别
【发布时间】:2016-05-08 14:20:58
【问题描述】:

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

这是基本代码:

// 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 之外),那么一切正常。但是,如果我在 main 中定义,则会出现“未定义对‘变量’的引用”错误。但我只有在 main 中时才会调用 source.cpp;那么,如果 variable 定义在与 func 相同的“范围”内,为什么会出现此错误?是编译器在链接完成之前抢先给出错误吗?还是与我将其声明为“外部”的事实有关?

【问题讨论】:

  • 包含两个连续下划线 (__SOURCE_HPP_INCLUDED__) 的名称和以下划线后跟大写字母的名称保留给实现。不要使用它们。
  • 您介意详细说明一下吗? “实施”是什么意思?这是“经验法则”还是编译器以特殊方式解析它?
  • 编译器可能会专门处理它们,但主要是为了使用它们作为内部名称的标准库(C 和 C++)的利益。如果某些源代码定义了一个具有类似名称的宏,并且库在标头中使用相同的名称,您将收到非常奇怪的错误消息。如果您对函数、类型或变量使用这样的名称,您可能会遇到名称冲突。如果您的代码也显示using namespace std;,那么您的风险就会成倍增加。
  • 啊,明白了。谢谢你告诉我!

标签: c++ global-variables main


【解决方案1】:

您不能在函数内定义全局变量。您实际上是在定义一个不同的、不相关的局部变量,它恰好具有相同的名称。

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

【讨论】:

  • 好的,那是因为我在标题中将它声明为全局变量。这是有道理的。
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多