声明在函数内创建的全局结构

时间:2014-06-18 00:04:54

标签: c struct global

我有许多需要共享结构的函数,但由于结构的大小是变量的,如果我在所有函数之外声明它,我会得到一个错误,是否有办法在特定函数内声明一个结构让所有其他人都可以访问它吗?

这是我到目前为止所做的:

头文件:

//  functions.h
struct Pixel
{
    int x; // x axis of pixel location
    int y; // y axis of pixel location
    int r; //red
    int g; //green
    int b; //blue
};

//failed attempt at declaring pixels as global
extern struct Pixel pixels[];

struct pixels []在一个单独的文件中定义,该文件包含使用它的所有函数,并包含上面提到的头文件

int Parser(FILE* file)
{
    // lots of foo 

    // structure declaration where linecount is a variable number generated 
    // in another function but declared globally
    struct Pixel pixels[linecount];
}

2 个答案:

答案 0 :(得分:2)

如果声明一个extern变量,那么变量定义必须在文件范围(全局)中。但是你的定义是在函数范围内(本地)。

这意味着标头中的声明extern struct Pixel pixels[];必须在.c文件(以及文件范围)中附带定义struct Pixel pixels[15];,其中SIZE(在本例中为15)是常量表达式。常量表达式不能是变量,也不能是const变量。

如果希望在运行时定义数组pixels的大小,则必须将数组更改为指针。

extern struct Pixel* pixels;   //header

struct Pixel* pixels = NULL ;   //file scope

if( !pixels )    //function scope
    pixels = malloc( sizeof( struct Pixel ) * linecount ) ;

答案 1 :(得分:0)

是。您可以通过使用指向结构的指针并在任何一个函数中为该指针动态分配内存来实现。

extern struct Pixel *pixels; // In header file
struct Pixel *pixels = NULL; // Global    

由于pixels被声明为全局,因此任何函数都可以访问已分配的内存。

void foo()
{

     pixels = malloc(sizeof(struct Pixel)*linecount);
     //Do some stuff  
}  

但是在必要之前不要使用全局变量。