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 のプロトタイプはヘッダーのプロトタイプ.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ファイルごとに1つのファイルがあり.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
}
于 2012-06-28T04:41:37.410 に答える
0

それは動作しますが、これは大丈夫ですか?

それは「密結合」とスパゲッティコードにつながるので、それは確かに悪い習慣と見なされます。

推奨される方法は次のとおりです。

//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);
于 2012-06-28T06:57:55.743 に答える
0

extern変数の定義が他の場所にあることをコンパイラーに通知します(特殊なケースは、変数が同じコンパイル単位で定義されている場合です)。しかし、リンカはこれらの定義を見つける必要があります。したがって、それらをヘッダーファイルで宣言し、それらexternを使用することを目的としたソースファイルにヘッダーファイルをインクルードします。ただし、それらを1つのソースファイルで定義することを忘れないでください。あなたがしていることは私には大丈夫のようです。

于 2012-06-28T04:41:44.440 に答える