如何在.c文件中定义一个全局作用域的struct对象,在C中的头文件中定义?

w8biq8rn  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(103)

这里是Define.c

#include "Define.h"

// this line working

// Format date_format = { "YYMMDD", "%02u%02u%02u", 6, 3 };  // line1     

Format date_format;

// this line are now working

strcpy(date_format.format, "YYMMDD");            // line2
strcpy(date_format.scanformat, "%02u%02u%02u");  // line3
date_format.scansize = 3;                        // line4
date_format.printsize = 6;                       // line5

这里是Define.h

#ifndef _DEFINE_H
#define _DEFINE_H

typedef struct Format
{
    char format[256];
    char scanformat[256];
    unsigned int printsize;
    unsigned int scansize;

} Format;

extern Format date_format;

#endif

main.c

#include <stdio.h>
#include "Define.h"

int main(int argc, char* argv[])
{
    printf(date_format.format);
    getchar();
    return 0;
}

我的问题是为什么第二个定义在第一行。2/3/4/5不工作吗?这就是我对这个结构体的初始化/定义/赋值的全部要求。或者它必须包含在一个方法中,但是如果是这样,那么为什么line 1可以正常工作呢?我正在使用Visual Studio 2017

vc6uscn9

vc6uscn91#

我想你问的是为什么你不能初始化全局结构变量,然后将它们外部化--答案是因为编译器不知道你想要什么。在main之外的文件中声明全局date_format变量,但没有初始化。
您可以将初始化尝试从Define.c移动到在main.c的全局级别上声明。但你不想这样。另一种方法是通过静态初始化(您已经尝试过)。我也有点困惑,为什么你不想把初始化int一个函数?但无论如何...
我假设你想要的是在另一个文件中初始化结构,并在程序的另一部分使用相同的值。那么问题就在于如何声明extern以及如何重新声明Format date_format
你想在Define.c中初始化struct变量:

#include "define.h"

Format date_format;

void initStuff()
{
    strcpy(date_format.format, "YYMMDD");            // line2
    strcpy(date_format.scanformat, "%02u%02u%02u");  // line3
    date_format.scansize = 3;                        // line4
    date_format.printsize = 6;                       // line5
}

然后在Define.h中告诉编译器该结构体是一个extern:

#ifndef _DEFINE_H
#define _DEFINE_H

#include <string.h>

typedef struct Format
{
    char format[256];
    char scanformat[256];
    unsigned int printsize;
    unsigned int scansize;

} Format;

extern Format date_format;

void initStuff();

#endif

然后在main中直接调用date_format

int main()
{
    initStuff();
    printf("%s\n", date_format.format);
    printf("%s\n", date_format.scanformat);
    printf("%i\n", date_format.scansize);
    printf("%i\n", date_format.printsize);

    return 0;
}

输出:

YYMMDD
%02u%02u%02u
3
6
qacovj5a

qacovj5a2#

你试图在函数之外执行函数调用,试着将代码从Define.c移到main,或者像这样将它们放在init函数中。

#include "Define.h"     

Format date_format;

void date_format_init()
{
    strcpy(date_format.format, "YYMMDD");
    strcpy(date_format.scanformat, "%02u%02u%02u");
    date_format.scansize = 3;
    date_format.printsize = 5;
}

在main调用中,函数#include<stdio.h>#include“Define.h”

int main(int argc, char* argv[])
{
    date_format_init();
    printf(date_format.format);
    getchar();
    return 0;
}

在Define.h中添加extern void date_format_init()

相关问题