共享公共对象 - 警告“已定义但未使用”

10

我有许多个 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% 

因此,我将它们与其他所有类共享的对象一起放在了头文件中。

当我编译项目时,我会收到很多警告(来自不使用这些变量的类),它们抱怨这些变量被定义但未使用。但是我需要它们!

所以我想问,有没有一种方法可以定义这些变量,使得不使用这两个变量的类可以使用这个头文件而不会抛出关于未定义的警告?

提前谢谢你。


1
你看到的警告只是告诉你变量没有被使用。实际上,这并不需要担心。但是需要注意的是,并非所有的警告都应该被忽略。 - Carl Winder
1
不是。如果您不想出现这些警告,请为这些静态公共变量使用单独的头文件。 - Arunmu
我明白了,但是有没有一种方法可以在这个头文件中定义它们,以便需要它们的类可以调用它们,而不需要它们的类则不会?像某种哈希或全局方法?命名空间?抱歉,我对此不是很擅长 :) - Perl_noob
@Perl_noob:这只是一个警告。根据定义,它不是错误;这样做并没有错。编译器只是让你知道可能有些东西会出问题。 - Nicol Bolas
3个回答

18
要么将它们声明为const,要么将它们声明为extern并在仅一个源文件中定义。编译器应该期望常量在头文件中被定义但没有使用,并且不会因此发出警告。

定义你不使用的静态变量通常是错误的迹象,因此该警告在这种情况下是有用的。(如果您确实希望在多个翻译单元中拥有单独的可修改副本,则应重新考虑程序设计)。


C++编译器真的应该区分头文件/包含的源代码文件和其他文件吗? - Alexey Frunze
@Alex:不,我不认为我说过那样的话。这个警告来自于声明一个static、非const变量,但没有使用它。这通常表明它应该是constextern,或者根本不存在,因此这个警告通常是有用的。 - Mike Seymour
我从"A compiler should expect constants to be defined in header files but not used, and not give a warning for that."这句话中推断出了这种可能性。 - Alexey Frunze
1
@Alex:好的,或许加上一些额外的标点符号会使这更加清晰明了。 - Mike Seymour

13
警告并没有说这些变量没有被定义。警告明确指出,这些变量已经被定义了,但是没有被使用。也就是说,你请求了某些东西,但是却没有使用它。
你真正的问题在于这些是静态全局变量。这意味着每个包含该头文件的.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;

我明白你的意思,非常感谢你帮助澄清了这个问题 :) 我可以补充一下吗?我想尝试减少代码行数,我觉得单独创建一个头文件来声明它们,然后在每个需要它们的类中再次定义它们似乎有点浪费。难道没有其他方法吗? - Perl_noob
1
@Perl_noob:如果你正在使用extern技巧,那么你不需要在每个.cpp文件中定义它们。这会导致链接时出现多个定义。你只需要在一个.cpp文件中定义它们,具体哪一个文件由你决定。这就像你将函数的原型放在许多包含文件中一样,但是只将实现放在一个.cpp文件中。 - Nicol Bolas

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接