4

1) static、extern 和 const 以及它们在 C 和 C++ 中的使用有何不同?(默认联动和其他差异)

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)考虑以下

头文件.h

static int z = 23;

测试.c

#include"header.h"

z = 33;  //gives error redefinition of z!!!??

void abc()
{
    z = 33;  //perfectly fine here!!??
}

在标头中定义/声明的静态变量在每个文件中都有内部链接,这意味着每个文件都将具有该变量的单独副本。那么为什么在任何函数外部为该 var 赋值会产生重新定义错误,而它是函数内部的完美文件?

编辑:添加了第四个问题。这非常令人困惑。

**PS:现在我只寻找问题 1 和 4 的答案。

4

4 回答 4

5

1)

static 表示不将对象放入全局符号表中。从好的方面来说,您可以毫无问题地拥有多个定义的符号。不利的一面是,不会为任何静态变量/方法生成符号,因此会使调试变得更加困难。

2&3)

在标题中:

extern const int xyz;

在包含标头的源文件中(最好是名称与 .h 匹配的相同 .cc):

const int xyz = 123;

这样每个人都知道 xyz,但它只在一个源文件中定义。

于 2012-10-05T16:36:48.363 回答
3

我可以在头文件中声明一个 const 变量,但由于我们可以定义它提供一个值,而且我们也不能在包含该头文件的文件中分配一个值,所以它实际上是无用的。

如果你想要一个外部链接的符号,你可以在头文件中声明它,然后在你的源文件之一中定义它。你可以选择哪一个。

但是,对于 aconst int通常来说,它具有外部联系是没有意义的。只需static const int xyz = 123;在标题中为其提供内部链接即可。

这适用于 C:在 C++const中,默认情况下全局变量具有内部链接。

于 2012-10-05T17:25:21.400 回答
1

(OP:你问了几个问题,所以你得到了部分答案)

要回答这个

有没有办法在头文件中定义 const ,然后通过包含头文件在多个文件中访问它?

您可以将const变量的声明(包括值)放在头文件中:

extern const int xyz = 123; // note: extern

然后将定义放在一个源文件中:

const int xyz; // note: no value provided

这仅适用于 c++,而不适用于 C(或者更确切地说,我相信它在 C 中不起作用;但从未检查过)。

于 2012-10-05T17:35:06.613 回答
0

1)静态:用于将函数或变量声明为局部的。它们将仅在定义的文件中使用。如果它们是在头文件中定义的,那么它们将在包含该文件的文件中使用

extern 用于导入外部变量或函数。变量或函数应在其他文件中定义,不应使用静态定义

2)代替定义 const ,const int X = 5您可以使用宏来使用替代解决方案:#define X 5

于 2012-10-05T16:38:13.603 回答