我想知道是否可以在同一个头文件中声明和定义一个extern变量。我需要跨多个文件引用变量,虽然我意识到有更好的方法来实现这一点,但在这种情况下使用extern是唯一的选择。所以可以这样做:
// in main.h
extern int foo;
int foo;
etc...
然后包含main.h的任何文件都可以访问foo?许多示例引用了在单独的cpp文件中定义extern-d变量,但我只是想知道我建议的方式是否会导致项目其余部分出现问题。
答案 0 :(得分:9)
如果将一个定义放在头文件中,当涉及多个源文件时,最终会有多个定义。
例如,假设main.c
和other.c
都包含foo.h
。当您编译这些文件时,您将获得main.o
和other.o
,这两个文件都定义为int foo
。如果您然后尝试将main.o
和other.o
链接到单个可执行文件中,则会收到链接器错误,指出int foo
已定义两次。
要正确执行此操作,您在头文件中声明您的变量extern int foo
。然后,在一个(且只有一个)源文件中,您定义变量int foo
。
答案 1 :(得分:4)
真正的定义(不是extern
)不应该在头文件中。
如果你想从不同的cpp中获得一个全局变量,你应该做两件事:一个cpp中的定义和h中的extern声明。
E.g:
// global.h
extern int foo;
和
// global.cpp
int foo;
然后在任何需要foo
的文件中:
#include "global.h"
当然,global.cpp
必须是项目的一部分(用其他文件编译)
答案 2 :(得分:1)
只有在没有多个文件定义相同变量时,您在C++
中完全合法。
变量或函数可以在另一个源文件中定义,或 稍后在同一个文件中。变量和函数的声明 默认情况下,文件范围是外部的。
通常我们extern
在其他文件中声明的全局变量。
这与初始化为0
的全局变量一样好。