Const,static,extern及其在C和C++中的组合

Yog*_*ngh 4 c c++

1)在C和C++中,static,extern和const及其使用有何不同?(默认链接和其他差异)

2)在C中使用的头文件中允许以下声明和定义,然后将其包含在多个文件中.

static int testvar = 233;
extern int one;
extern int show();
int abc;
const int xyz;  // const int xyz = 123; produces error
Run Code Online (Sandbox Code Playgroud)

const 定义在编译期间产生和错误(可能是因为多个定义).但是我可以在头文件中声明一个const变量,但是因为我们可以定义它提供一个值,我们也不能在这个头包含的文件中分配一个值,它实际上是没用的.有没有办法在头文件中定义const,然后通过包含标题在多个文件中访问它?

3)需要做哪些更改(如果有的话),以便此标头可以包含在C++中的多个文件中?

4)考虑以下内容

header.h

static int z = 23;
Run Code Online (Sandbox Code Playgroud)

test.c的

#include"header.h"

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

void abc()
{
    z = 33;  //perfectly fine here!!??
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dig*_*ost 5

1)

static表示不将对象放在全局符号表中.从好的方面来说,您可以使用多个定义的符号而不会出现问题.在缺点方面,没有为任何静态变量/方法生成符号,因此它可以使调试更难.

2&3)

在标题中:

extern const int xyz;
Run Code Online (Sandbox Code Playgroud)

在包含标头的源文件中(理想情况下,名称与.h匹配的.cc):

const int xyz = 123;
Run Code Online (Sandbox Code Playgroud)

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