【发布时间】: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