2

ここに私が解決しようとしている問題があります.Cでプログラミングしています.

構造体を初期化できる関数があります。

typedef struct {
  int val1;
  int val2;
} custom_t;

custom_t init_custom() {
  custom_t temp;

  temp.val1 = 5;
  temp.val2 = 5;


  return temp;
}

そして、次のように使用します。

custom_t some_name = init_custom();

custom_t を入力として取り、それを使用していくつかの作業を行うことができる 4 つの関数があります。

別のファイルには、マルチスレッド環境で実行される多くのライブラリ関数があります。これらのライブラリ関数はすべて、スレッドに関係なく、同じ custom_t 変数で作業を行う必要があります。

ライブラリ関数は custom_t 変数を渡されません。これは、別のユーザーが custom_t 変数を考えずにライブラリ関数を使用できるようにすることが目的であるためです。

ライブラリ関数を定義する名前空間で custom_t 変数をグローバルにする必要があると考えていますが、グローバル変数は const でなければならないというエラーが表示されます。

これを達成する方法がわかりません。私が得ることができるすべての助けに感謝します。私の説明が十分でなかった場合は、遠慮なく質問してください。詳しく説明します。

編集:変数の初期化のタイプミスを修正

4

2 に答える 2

1

@CraigEsteyの回答に対するコメントで明らかになったように、問題は変数が である必要があることconstではなく、その初期化子がコンパイル時の定数である必要があることです。この種の問題に対する 1 つのアプローチは、関数の戻り値としてではなく、マクロを介して静的な初期化値を定義することです。たとえば、適切なヘッダー ファイルで次のように宣言します。

typedef struct {
    int val1;
    int val2;
} custom_t;

#define CUSTOM_T_INITIALIZER { .val1 = 5, .val2 = 5 }

custom_t次に、次のようなタイプの変数を初期化できます。

custom_t some_name = CUSTOM_T_INITIALIZER;

、ファイル スコープを含む。

アップデート:

コンパイル時の定数ではない値をファイル スコープ変数または static-duration 変数に割り当てる必要がある場合 (集約型があり、そのメンバーの 1 つに必要な値がコンパイル時の定数ではない場合を含む)、その場合、その目的で初期化子を使用することはできません。代わりに、おそらく何らかの初期化関数を呼び出して、プログラムの開始後に必要な値をその変数に割り当てるように手配する必要があります。

于 2016-08-24T22:57:08.250 に答える