你可以使用静态和外部指针?如果他们存在
答案 0 :(得分:11)
要回答关于何时可以使用它们的问题,请举几个简单的例子:
静态指针可用于实现一个总是向程序返回相同缓冲区的函数,在第一次调用它时分配它:
char * GetBuffer() {
static char * buff = 0;
if ( buff == 0 ) {
buff = malloc( BUFSIZE );
}
return buff;
}
extern(即全局)指针可用于允许其他编译单元访问main的参数:
extern int ArgC = 0;
extern char ** ArgV = 0;
int main( int argc, char ** argv ) {
ArgC = argc;
ArgV = argv;
...
}
答案 1 :(得分:8)
简短回答:它们不存在。 C99 6.7.1说“最多可以在声明中的声明说明符中给出一个存储类说明符”。 extern
和static
都是存储类说明符。
答案 2 :(得分:3)
假设我有一个指针,我想让全局可用于多个翻译单元。我想在一个地方(foo.c)定义,但在其他翻译单元中允许多个声明。 “extern”关键字告诉编译器这不是对象的定义声明;实际定义将出现在其他地方。它只是使对象名可用于链接器。编译和链接代码时,所有不同的翻译单元将按该名称引用同一对象。
假设我还有一个指针,我想让全局可用于单个源文件中的函数,但不能让其他翻译单元看到它。我可以使用“static”关键字来指示对象的名称不会导出到链接器。
假设我还有一个指针,我只想在一个函数中使用,但在函数调用之间保留了该指针的值。我可以再次使用“static”关键字来表示该对象具有静态范围;它的内存将在程序启动时分配,直到程序结束才会释放,因此对象的值将在函数调用之间保留。
/**
* foo.h
*/
#ifndef FOO_H
#define FOO_H
/**
* Non-defining declaration of aGlobalPointer; makes the name available
* to other translation units, but does not allocate the pointer object
* itself.
*/
extern int *aGlobalPointer;
/**
* A function that uses all three pointers (extern on a function
* declaration serves roughly the same purpose as on a variable declaration)
*/
extern void demoPointers(void);
...
#endif
/**
* foo.c
*/
#include "foo.h"
/**
* Defining declaration for aGlobalPointer. Since the declaration
* appears at file scope (outside of any function) it will have static
* extent (memory for it will be allocated at program start and released
* at program end), and the name will be exported to the linker.
*/
int *aGlobalPointer;
/**
* Defining declaration for aLocalPointer. Like aGlobalPointer, it has
* static extent, but the presence of the "static" keyword prevents
* the name from being exported to the linker.
*/
static int *aLocalPointer;
void demoPointers(void)
{
/**
* The static keyword indicates that aReallyLocalPointer has static extent,
* so the memory for it will not be released when the function exits,
* even though it is not accessible outside of this function definition
* (at least not by name)
*/
static int *aReallyLocalPointer;
}
答案 3 :(得分:2)
请参阅How to correctly use the extern keyword in C
Internal static variables in C, would you use them?
本质上,当在函数中使用时,“静态”(在标准C中)允许变量不被消除,因为一旦函数结束通常就会消失(即,每次调用函数时它都保留其旧值)。 “Extern”扩展了变量的范围,因此可以在其他文件中使用(即,它使其成为全局变量)。
答案 4 :(得分:2)
简短的回答。 静态是持久性的,因此如果在函数中声明它,当再次调用该函数时,该值与上次相同。如果您全局声明它,那么它只是该文件中的全局。
Extern表示它在全局声明,但在不同的文件中。 (它基本上意味着这个变量确实存在,这就是它所定义的)。