我在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;
它有效,但这样做可以吗?我是编程的新手,任何建议都会受到赞赏。感谢
答案 0 :(得分:3)
extern
表示变量在某些其他编译单元(即。.c
文件)中可用。通常,每个.h
文件都有一个.c
文件,可以将任何内容“公开”到其他单元。
所以对于这样的事情,我可能会:
int x, y, z;
#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
}
答案 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);