我有许多C ++类,很多(不是全部)共享两个“静态大小变量”,例如
share.h
/*Other variables in this header used by all classes*/
static size width=10;//Used by about 60%
static size height = 12;//used by about 60%
因此,我将它们与所有类共享的其他对象一起放在头文件中。
当我编译项目时,我收到很多警告(来自不使用这些的类),抱怨它们被定义而不被使用。但我在那里需要他们!
所以我问,有没有办法定义这些,所以不使用这两个变量的类可以使用这个头文件而不会抛出关于它们没有被定义的警告?
提前谢谢
答案 0 :(得分:12)
声明它们const
,或声明它们extern
并在一个源文件中定义它们。编译器应该期望定义常量(在头文件中)但不使用,而不是给出警告。
定义不使用的静态变量通常是错误的标志,因此在这种情况下警告很有用。 (如果您确实需要在多个翻译单元中对这些变量进行单独的,可修改的副本,那么您应该重新考虑您的程序设计。)
答案 1 :(得分:10)
警告并未说明他们没有被定义。该警告明确指出它们已被定义,但不是使用。也就是说,你问过什么,但是你没有使用它。
您真正的问题是这些是static
个全局变量。这意味着包含标头的每个.c或.cpp文件都将具有该文件的自己的副本。
因此,如果a.cpp
和b.cpp
包含share.h
,a.cpp
可以将width
更改为20,b.cpp
不能看到这种变化的影响。这就是编译器发出警告的原因。因为如果您在文件中声明static size width
,并且不在该特定文件中使用它,那么您肯定无法在其他任何地方使用 。这是可疑的行为,定义一个你从未使用过的变量。
通常,您不应将全局static
变量放在标题中。如果你想要常量值,你应该声明它们:
const size width=10;//Used by about 60%
const size height = 12;//Used by about 60%
如果你不希望它们是常量,那么你应该在extern
的标题中声明它们(不初始化它们),然后选择一个 .cpp文件并定义它们(没有extern
,但有一个值)。如下:
//share.h
extern size width;
extern size height;
//share.cpp
size width = 10;
size height = 12;
答案 2 :(得分:1)
您需要使用const限定符,而不是静态。静态的含义与你的意图完全不同。您可以在http://www.cprogramming.com/tutorial/statickeyword.html找到有关静态的更多信息。