C结构体的声明(extern)与调用的方式

要求如下,在.h文件中这样定义:

typedef struct typFNT_GB16       // 汉字字模数据结构
{
    signed char Index[2];        // 汉字内码索引
    char Msk[32];                // 点阵码数据
};

struct typFNT_GB16 code GB_16[] =     // 数据表
{
    0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,
    0xFF,0x20,0x22,0xAC,0x20,0x30,0x20,0x00,
    0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,
    0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,
    0x40,0x20,0xF8,0x07,0x00,0xF8,0x02,0x04,
    0x08,0x04,0x04,0x04,0x04,0xFE,0x04,0x00,
    0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,
    0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00
};

同时需要在多个.c文件中使用该struct, 但是多次include 该.h文件提示重复定义,应该修改如下:


新建一个xx.h和xx.c文件

在xx.h文件中定义该结构体,同时对结构体变量作extern:

typedef struct typFNT_GB16          // 汉字字模数据结构
{
    signed char Index[2];           // 汉字内码索引
    char Msk[32];                   // 点阵码数据
};

extern struct typFNT_GB16 code GB_16[];

在xx.c文件中include该.h文件,同时作结构体变量的初始化:
#include "xx.h"

struct typFNT_GB16 code GB_16[] =         // 数据表
{
    0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,
    0xFF,0x20,0x22,0xAC,0x20,0x30,0x20,0x00,
    0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,
    0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,
    0x40,0x20,0xF8,0x07,0x00,0xF8,0x02,0x04,
    0x08,0x04,0x04,0x04,0x04,0xFE,0x04,0x00,
    0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,
    0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00
};

在其它.c文件中需要使用该结构体时,直接include .h文件即可这样编译通过。实际上结构体是一种数据类型,.h文件定义了一种类型的结构体,并声明为extern形式允许外部调用它,而初始化code GB_16[] 这个结构体应当在.c文件中进行。


类型的定义和类型变量的定义不同,类型定义只是描述一个类型,是给编译器看的,不会产生可执行代码。变量定义是指在执行文件中真实的存在这么一块内容。因此,类型定义可以重复出现也没关系,类型变量是不能在多个.c中出现,否则就是重复定义。因为每个.c里都要写清楚类型定义很麻烦,所以一般都把类型定义写在.h里,而在.c里采用简单的写法。

  • 17
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言中,可以将结构体导出为动态链接库(DLL),并在其他程序中调用该DLL中的结构体。下面是一个简单的示例: 首先,定义一个包含结构体的头文件,例如“mystruct.h”: ``` #ifndef MYSTRUCT_H #define MYSTRUCT_H typedef struct { int x; int y; } MyStruct; #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) MyStruct* createMyStruct(int x, int y); #ifdef __cplusplus } #endif #endif ``` 在上面的代码中,我们定义了一个包含两个整数的结构体MyStruct,并将其导出为DLL。此外,我们还定义了一个函数createMyStruct,该函数将返回一个指向MyStruct的指针,并接受两个整数参数x和y。 接下来,实现这个头文件中的函数,例如“mystruct.c”: ``` #include "mystruct.h" #include <stdlib.h> MyStruct* createMyStruct(int x, int y) { MyStruct* s = (MyStruct*)malloc(sizeof(MyStruct)); s->x = x; s->y = y; return s; } ``` 在上面的代码中,我们实现了createMyStruct函数,该函数将返回一个指向MyStruct的指针,并将x和y设置为传递的参数。 最后,编译DLL文件。在Windows上,可以使用Visual Studio的“动态链接库”项目类型来编译DLL文件。 现在,我们可以在其他C程序中使用这个DLL文件。以下是一个简单的示例程序: ``` #include <stdio.h> #include <windows.h> #include "mystruct.h" typedef MyStruct* (*CreateMyStructFunc)(int, int); int main() { HMODULE dll = LoadLibrary("mystruct.dll"); if(dll == NULL) { printf("Failed to load DLL!\n"); return 1; } CreateMyStructFunc createMyStruct = (CreateMyStructFunc)GetProcAddress(dll, "createMyStruct"); if(createMyStruct == NULL) { printf("Failed to get function address!\n"); FreeLibrary(dll); return 1; } MyStruct* s = createMyStruct(1, 2); printf("x = %d, y = %d\n", s->x, s->y); FreeLibrary(dll); return 0; } ``` 在上面的代码中,我们首先使用LoadLibrary函数加载DLL文件。然后,使用GetProcAddress函数获取createMyStruct函数的地址。最后,我们调用该函数并输出结果。注意要释放DLL文件使用的资源,可以使用FreeLibrary函数。 这是一个简单的示例,可以根据自己的需求修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值