( 1)在C和C++中,静态、外部和const是如何使用的,它们的使用有哪些不同?(默认链接和其他差异)
2)允许在C中使用的头文件中包含以下声明和定义,然后将其包含在多个文件中。
static int testvar = 233;
extern int one;
extern int show();
int abc;
const int xyz; // const int xyz = 123; produces error
const 定义在编译期间产生错误(可能是由于多个定义造成的)。但是,我可以在头文件中声明是一个const变量,但是由于我们可以定义它提供一个值,而且我们也不能在这个头文件中指定一个值,所以它实际上是无用的。是否有一种方法可以在头文件中定义const,然后通过包含头文件在多个文件中访问它?
3)需要进行哪些更改(如果有的话),以便在C++中的多个文件中包含此标头
4)考虑以下几点
header.h
static int z = 23;
test.c
#include"header.h"
z = 33; //gives error redefinition of z!!!??
void abc()
{
z = 33; //perfectly fine here!!??
}
在头文件中定义/声明的静态vars在每个文件中都有内部链接,这意味着每个文件将有该变量的单独副本。那么,为什么将值赋值到任何函数之外的var会导致重新定义错误,而它在函数中是完美的文件呢?
编辑:增加了第四个问题。这很让人困惑。
**PS:现在我只寻找问题1和4的答案。
发布于 2012-10-05 08:36:48
1)
静态意味着不在全局符号表中放置对象。在好的方面,您可以有多个定义的符号,没有问题。另一方面,没有为任何静态变量/方法生成符号,因此它会使调试更加困难。
2及3)
在标题中:
extern const int xyz;
在包含头部的源文件中(理想情况下,名称与.cc匹配的.h相同):
const int xyz = 123;
这样,每个人都知道xyz,但它只在一个源文件中定义。
发布于 2012-10-05 09:25:21
我可以在头文件中声明一个const变量,但是由于我们可以定义它提供一个值,而且我们也不能在这个头文件中指定一个值,所以它实际上是无用的。
如果您想要一个外部链接的符号,您可以在头文件中声明它,然后在您的一个源文件中定义它。你可以选择哪一个。
然而,对于一个const int
,通常没有任何意义,它有外部链接。只需将其与头部中的static const int xyz = 123;
进行内部链接即可。
这适用于C:在C++中,const
默认具有内部链接。
发布于 2012-10-05 09:35:06
(你问了几个问题,所以你得到了部分答案)
回答这个问题
是否有一种方法可以在头文件中定义const,然后通过包含头文件在多个文件中访问它?
可以将const
变量的声明(包括值)放在头文件中:
extern const int xyz = 123; // note: extern
然后将定义准确地放在一个源文件中:
const int xyz; // note: no value provided
这只适用于c++,而不适用于C(或者更确切地说,我认为它在C中不起作用;但从未检查过)。
https://stackoverflow.com/questions/12750427
复制