从C中的文本文件初始化全局变量

时间:2012-06-28 04:37:21

标签: c

我在C中有一个初学者问题。我在阅读一个文件时遇到了麻烦,该文件的值初始化全局变量以便在不同的C文件中共享。我的真实项目有许多变量要在多个文件中使用和更改。我读取参数的文件是:

#include <stdio.h>
#include <stdlib.h>
#include "parameters.h"
#include "prototypes.h"
#define MAX_LENGTH 100

int ReadParameters(void)
{
    char line[MAX_LENGTH];
    FILE *fp = fopen("parameters.in", "r");

    if (! fp) 
       return EXIT_FAILURE;

    int numread = 0;
    while (fgets(line, MAX_LENGTH, fp)) {
        numread += sscanf(line, "x = %d", &x);
        numread += sscanf(line, "y = %d", &y);
        numread += sscanf(line, "z = %d", &z);
    }
    fclose(fp);

    return numread;
}

我在头文件中将变量x,y和z定义为外部:

#ifndef PARAMETERS_H
#define PARAMETERS_H

extern int x;
extern int y;
extern int z;

#endif

ReadParameters.c的原型位于头文件prototype.h中,x,y和z中的值用于main.c:

#include <stdio.h>
#include <stdlib.h>
#include "parameters.h"
#include "prototypes.h"

int main()
{

   ReadParameters();
   printf("The value of x: %d\n", x);
   printf("The value of y: %d\n", y);
   printf("The value of z: %d\n", z);

   x += 15;
   y -= 5;
   z -= 20;

   printf("Now the value of x: %d\n", x);
   printf("Now the value of y: %d\n", y);
   printf("Now the value of z: %d\n", z);

   return EXIT_SUCCESS; 

}

当我编译时,我得到了对x,y和z的未定义引用的错误,我相信它,因为我只声明了未定义它们的变量。如果我从头文件中删除extern我没有错误,它运行但我读了不好的做法来定义头文件中的变量。如果我创建另一个.C文件并在那里定义变量:

#include "parameters.h"  
int x, y, z;

它有效,但这样做可以吗?我是编程的新手,任何建议都会受到赞赏。感谢

3 个答案:

答案 0 :(得分:3)

extern表示变量在某些其他编译单元(即。.c文件)中可用。通常,每个.h文件都有一个.c文件,可以将任何内容“公开”到其他单元。

所以对于这样的事情,我可能会:

parameters.c

int x, y, z;

parameters.h

#ifndef PARAMETERS_H
#define PARAMETERS_H

extern int x;
extern int y;
extern int z;

#endif

的main.c

#include "parameters.h"
int foo() {
    x = 4;   // setting x from parameters.c
}

答案 1 :(得分:0)

extern告诉编译器变量的定义位于其中(特殊情况是变量在同一编译单元中定义的位置)。但是链接器应该找到这些定义。因此,在头文件中声明它们extern并将头文件包含在要使用它们的源文件中。但是不要忘记在一个源文件中定义它们。你在做什么对我来说似乎没问题。

答案 2 :(得分:0)

  

它有效,但这样做可以吗?

这确实被认为是不好的做法,因为它会导致"tight coupling"和意大利面条代码。

首选方式是:

// parameters.h

void set_x (int x);

// parameters.c

#include "parameters.h"

static int private_x;  // static means: only visible/accessible from parameters.c

void set_x (int x)
{
  private_x = x;
}

// main.c

#include "parameters.h"

set_x (something);