首页 > 解决方案 > 在标头中声明变量并在 .c 中定义

问题描述

我的目标是在另一个 .c 文件中使用 templates.c 中定义的变量。

我正在尝试定义在 templates.h 文件中声明的 SHIP(我创建的结构)类型的变量,但出现此错误(其余变量出现类似错误:

templates.c:5:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘->’ token
 SHIP* Pickaxe->bitmap={  {'0','1','1','1','0'},
              ^~
templates.c:10:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘->’ token
 SHIP* Pickaxe->size=9;
              ^~

这是模板.h

typedef struct{
    char bitmap[5][5];
    int size;
}SHIP;

extern SHIP *Pickaxe;
extern SHIP *Carrier;
extern SHIP *Battleship;
extern SHIP *Submarine;
extern SHIP *Cruiser;
extern SHIP *Destroyer;

和我定义变量的templates.c文件

#include<stdio.h>
#include"templates.h"
#include<stdlib.h>

Pickaxe->bitmap={  {'0','1','1','1','0'},
                   {'1','0','1','0','1'},
                   {'0','0','1','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','1','0','0'}};
Pickaxe->size=9;


Carrier->bitmap={{'0','0','1','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','1','0','0'}};
Carrier->size=5;

Battleship->bitmap={{'0','0','1','0','0'},
                    {'0','0','1','0','0'},
                    {'0','0','1','0','0'},
                    {'0','0','1','0','0'},
                    {'0','0','0','0','0'}};
Battleship->size=4;

Submarine->bitmap={{'0','0','0','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','0','0','0'}};
Submarine->size=3;

Cruiser->bitmap={{'0','0','0','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','1','0','0'},
                 {'0','0','0','0','0'}};
Cruiser->size=3;

Destroyer->bitmap={{'0','0','0','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','1','0','0'},
                   {'0','0','0','0','0'},
                   {'0','0','0','0','0'}};
Destroyer->size=2;

标签: c

解决方案


在 .c 文件中,Pickaxe需要定义指针等并赋值。例子:

// Form the data.  Make static not to clutter global name space.
static SHIP Pickaxe_data = {.size = 9, //
    .bitmap = { //
        {'0', '1', '1', '1', '0'}, //
        {'1', '0', '1', '0', '1'}, // 
        {'0', '0', '1', '0', '0'}, //
        {'0', '0', '1', '0', '0'}, //
        {'0', '0', '1', '0', '0'}}};

SHIP *Pickaxe = &Pickaxe_data;

先进的:

如果此数据不应更改,请制作const. 例子:

// .h    
extern const SHIP * const Pickaxe;
//                  ^^^^^ ----- Pointer should not get changed
//     ^^^^^ ------------------ Data referenced should not get changed     

// .c
static const SHIP Pickaxe_data = {.size = 9, //
    .bitmap = { //
        {'0', '1', '1', '1', '0'}, //
        ...
        {'0', '0', '1', '0', '0'}}};

const SHIP * const Pickaxe = &Pickaxe_data;

推荐阅读