如何在C中定义结构的全局指针?

时间:2013-12-29 16:29:10

标签: c pointers struct global

我正在尝试定义global pointer to a struct - 字体 - 因此我可以在项目中随时使用它。

编译时,我在initializer element is not constant的第Font_t* font = load_font("ubuntu");行收到此错误Font.c

Font.h:

#ifndef __FONT_H
#define __FONT_H

#include "Bitmap.h"
#include "Utilities.h"

/// Represents a Font
typedef struct {
    int letterSpacing;

    // symbols
    Bitmap_t* space;
    (...)
    Bitmap_t* y;
    Bitmap_t* z;
} Font_t;
extern Font_t* font;

/**
 * @brief Loads a font from disk
 *
 * @param filename name of the font to load
 */
Font_t* load_font(char const* fontName);

Font.c:

#include "Font.h"

#include "stdio.h"
#include "Utilities.h"
#include "video_gr.h"

Font_t* font = load_font("ubuntu");

Font_t* load_font(char const* fontName) {
    Font_t* font = (Font_t*) malloc(sizeof(Font_t));

    font->letterSpacing = 1;

    char path[200];
    strcpy(path, fontsPath);
    strcat(path, fontName);

    char tempPath[200];

    strcpy(tempPath, path); strcat(tempPath, "/space.bmp"); font->space = load_bitmap(tempPath);
    (...)
    strcpy(tempPath, path); strcat(tempPath, "/y.bmp"); font->y = load_bitmap(tempPath);
    strcpy(tempPath, path); strcat(tempPath, "/z.bmp"); font->z = load_bitmap(tempPath);

    return font;
}

4 个答案:

答案 0 :(得分:3)

Font_t* font = load_font("ubuntu");

你做不到。您不能在全局范围内以这种方式调用函数。您需要拆分声明和初始化。

在全球范围内:

Font_t* font;

首次使用时,在主要内部:

font = load_font("ubuntu");

答案 1 :(得分:1)

您无法使用不是常量值的内容初始化全局变量。放置这一行:

font = load_font("ubuntu");

在您的代码中,在尝试使用font的任何其他代码之前。

仅作为全球声明留下这一行:

Font_t* font = NULL;

答案 2 :(得分:1)

你可以这样做,以便在字体模块中保持字体的初始化。

部首:

// extern Font_t* font; // delete this
Font_t* get_default_font(); // use a function instead

来源:

Font_t* g_default_font = NULL;

Font_t* get_default_font() {
   if(!font) {
       g_default_font = load_font("ubuntu");
   }
   return g_default_font;
}

答案 3 :(得分:0)

您是否在所有功能之外使用此功能

Font_t * font = load_font(“ubuntu”);

如果是的话,我认为你不会这样做吗?