static,extern关键词和函数指针数组

Page content

extern

从该文件外部获取变量定义,在文件域默认有extern属性。存储属性为static,也就是在文件执行前就被放在静态数据区。

static

只在该文件域可以使用,存储属性为static。

实例

extern.c

#include <stdio.h>

int k = 10;
extern void print(void);

int
main()
{
    printf("k: %d\n", k);
    print();
}

extern2.c

#include <stdio.h>


void print(void)
{
    extern int k;
    printf("extern int k: %d\n", k);
}

shell

$ gcc -o ex extern.c extern2.c
$ ./ex

函数指针数组

#include <stdio.h>

static int
print1(void)
{
    printf("function: print1()\n");
}

static int
print2(void)
{
    printf("function: print2()\n");
}


static int (*arr[])(void) = {
[0] print1,
[1] print2,
};

int (* foo)(void);

int
main(void)
{
    foo = arr[0];
    foo();
}

__static int (*arr[])(void)__可以理解为arr[]数组中存有两个类型为__static int(void)__的函数指针


static关键词可以设计__抽象数据类型ADT(abstract data type)__黑盒。

可以设计一个这样的头文件作为接口: list.h

/*
**
**  headfile for ADT
**
*/

/* macro */
#define NAME_LEN 30
#define ADDR_LEN 100
#define PHONE_LEN 11

#define MAX_ADDRESSES 1000

/* interface declaration */
char const *
lookup_address(char const *name);

char const *
lookup_phone(char const *name);


list.c

#include <stdio.h>
#include <string.h>
#include "list.h"


/* static data type*/
static char name[MAX_ADDRESSES][NAME_LEN];
static char address[MAX_ADDRESSES][ADDR_LEN];
static char phone[MAX_ADDRESSES][PHONE_LEN];

static int
find_entry(const char *name2find)
{
    int entry;

    for (entry = 0; entry < MAX_ADDRESSES; entry += 1)
        if(strcmp(name2find, name[entry]) == 0)
            return entry;

    return -1;
}


const char *
lookup_address(const char *name)
{
    int entry;

    entry = find_entry(name);
    if(entry == -1)
        return NULL;
    else
        return address[entry];
}

const char *
lookup_phone(const char *name)
{
    //  ...
    //  ...
    //  implement
    //  ...
    //  ...
}

这样调用接口就能获得数据,但是不能直接得到数据,有点像OOP编程的思想。当然,直接用数组作为数据存储的容器,这儿只是一个例子,改变自《pointers on c》。