如何声明静态变量但不定义它

Lai*_*han 7 c c++ static definition

有时我们需要预先声明一个静态变量然后使用它.但是这个声明的变量名可能是错误的,编译器无法检测到它,哎呀!

例:

/* lots of codes */
static some_type some_name; /* pre-declaration */
                            /* but it may define "some_name" */
/* use some_name */

/* lots of codes */

static some_type someName = initialization; /* definition */
/* use someName */

/* lots of codes */
Run Code Online (Sandbox Code Playgroud)

"some_name"和"someName"不同,我们在开头使用了一个错误的变量.如果预声明语句没有定义任何内容,编译器将检测到错误.

那么,如何声明静态变量但不定义它?如何将预声明更改为新的声明,使编译器可以检测到错误的名称?

caf*_*caf 9

gcc 在您描述的情况下会发出警告:

./x.c:3010: warning: 'someName' defined but not used
Run Code Online (Sandbox Code Playgroud)

解决方案:执行您当前正在执行的操作,但不要忽略编译器警告;)

编辑:

使用您更新的问题:不,我不相信有一种方法可以简单地声明一个静态变量(不定义它).

常见的解决方案是确保所有全局范围变量只声明一次,如果需要则使用初始化器.


Pra*_*rav 8

static some_type some_name; /*definition */
Run Code Online (Sandbox Code Playgroud)

静态变量some​​_name已初始化为0; 它是定义,而不仅仅是一个声明.

IMO,静态变量不能仅使用extern说明符在C中声明,因为它的链接始终是内部的.


AnT*_*AnT 5

在 C 语言中不可能创建具有内部链接的对象的非定义声明(即术语中的“预声明”)。

您可以尽可能接近的是一个暂定定义,这就是您在示例中的定义。但如果出现拼写错误,暂定定义将隐式产生独立定义,而不是链接器错误。