有时我们需要预先声明一个静态变量,然后再使用它。但是这个声明的变量名可能是错误的,编译器无法检测到它,哦!
示例:
/* 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 */"some_name“和"someName”是不同的,我们在开头使用了错误的变量。如果预声明语句没有定义任何东西,编译器将检测到错误。
那么,如何声明静态变量而不定义它呢?如何将预声明更改为新的声明,使编译器可以检测到错误的名称?
发布于 2009-12-08 12:41:53
在您描述的情况下,gcc会给出一个警告:
./x.c:3010: warning: 'someName' defined but not used解决方案:做你当前正在做的事情,但不要忽视编译器警告;)
编辑:
对于你更新的问题:不,我不相信有一种方法可以简单地声明一个静态变量(而不定义它)。
常见的解决方案是确保所有的全局作用域变量只声明一次,如果需要,可以使用初始化器。
发布于 2009-12-08 12:41:46
static some_type some_name; /*definition */静态变量some_name已被初始化为0;它是定义,而不仅仅是声明。
在IMO中,静态变量不能只在C中使用外部说明符声明,因为它的链接总是内部的。
发布于 2009-12-08 13:26:06
不可能在C语言中创建具有内部链接的对象的非定义声明(也就是您的术语中的“预声明”)。
这是一个暂定的定义,也就是您在示例中的定义。但在打字错误的情况下,暂定的定义将隐含地产生一个独立的定义,而不是链接器错误。
https://stackoverflow.com/questions/1864615
复制相似问题