0

我在 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;

它有效,但这可以吗?我是编程新手,任何建议都将不胜感激。谢谢

4

3 回答 3

3

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

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

参数.c

int x, y, z;

参数.h

#ifndef PARAMETERS_H
#define PARAMETERS_H

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

#endif

主程序

#include "parameters.h"
int foo() {
    x = 4;   // setting x from parameters.c
}
于 2012-06-28T04:41:37.410 回答
0

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

于 2012-06-28T04:41:44.440 回答
0

它有效,但这可以吗?

这确实被认为是不好的做法,因为它会导致“紧密耦合”和意大利面条式代码。

首选方式是这样的:

//参数.h

void set_x (int x);

//参数.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);
于 2012-06-28T06:57:55.743 回答