0

私は以前よりも大きなプロジェクトに取り組んでおり、コードを適切に構造化するために最善を尽くしています。私はマイクロコントローラーをプログラミングしていて、いくつかのグローバル変数を持っています。ここで読んだいくつかのアドバイスに従って、グローバル変数が使用される場所に含まれる「global_variables.h」ファイルですべて定義されています。

また、グローバル変数のtypedefを「global_variables.h」ファイルに入れました。

私が遭遇している問題は、グローバル変数を使用するfile1.cに、新しいtypedefをパラメーターとして受け入れるfunction1(new_type_t変数)があることです。これに伴う問題は、ヘッダー(file1.h)でfunction1プロトタイプが定義されているが、#include "global_variables.h"がfile1.cにあるため、file1.hの関数プロトタイプがtypedefを認識しないことです。 。

これはよくあることのように感じますが、グーグルはあまり役に立たなかったようです。「global_variables.h」と「global_variables_types.h」を別々に作成し、他のファイルのヘッダーに.hファイルを含め、ソースに.cを含める必要がありますか?

4

4 に答える 4

4

物事をスムーズに進めるためのヘッダーファイルには、いくつかの重要なルールがあります。\

まず、複数の包含が問題を引き起こさないように、ヘッダーガードを使用します。

module.h..で

  #ifndef MODULE_H
  #define MODULE_H
  ...
  #endif

これで、同じヘッダーを2回含めるかどうかは関係ありません。

2番目のルール(ヘッダーガードがあります)は、各.hファイルにコンパイルする必要のある他のすべてのファイルを含める必要があるということです。これを行うと、あるヘッダーを別のモジュールで再利用し、ヘッダーの順序を正しくするという点で、コードはより堅牢になります。

  #ifndef MODULE_H
  #define MODULE_H

  #include "module2.h"  // we need a type from here.

  void myFunc(Module2Type t); 
  #endif
于 2012-11-08T21:51:17.030 に答える
4

global_variables.hヘッダーファイルを持つのは賢明ではないと思います。

プロジェクトが小規模な1人のプロジェクト(たとえば、50KLOC = 5万行のソースコード未満)であり、再利用可能なライブラリを作成する予定がない場合は、すべてのプロジェクトに1つのヘッダーファイルを用意するのが賢明です。そのヘッダーファイルはグローバル変数を宣言し、その前に関連するタイプを宣言します。また、すべての関数を宣言し、最後にすべてのインライン関数を定義します。インライン化された関数を別のヘッダーファイル(メインヘッダーからのものを含む)に含めることを検討できます。

再利用可能なコードを作成する場合は、プロジェクトのサブシステムごとにヘッダーを作成してください。しかし、すべてのグローバル変数だけにヘッダーを付ける必要はないと思います。

最も重要なことは、グローバル変数のセットを最小限に抑えることです。片手の指でグローバル変数を数えることができるはずです。4つまたは5つを超えるグローバル変数が必要な場合は、関連するグローバル変数をグローバルにパックすることを検討してstructください。たとえば、画面サイズがグローバルデータの場合、宣言するのint screen_width, screen_height;ではなく、

 struct {
    int width;
    int height;
 } screen;

もちろん、本当のことはプロジェクトに依存し、おそらくビルドチェーンに依存します。一部のプロプライエタリコンパイラは実際には最適化せず、グローバル構造を使用すると不正なコードを生成する可能性があります。最近のGCCを(クロスコンパイラとして、できればLinuxで)使用する場合、GCCは適切に最適化されるため、この問題は発生しません。コンパイラで常にすべての警告を有効にします(例:build with gcc -Wall -g -O2

良いアドバイスは、あなたのものに似たいくつかの既存の自由ソフトウェアのソースコードを研究することです。

于 2012-11-08T21:56:35.380 に答える
1

extern一般的で柔軟なアプローチは、リンクを使用して.hでグローバル変数を宣言することです。次に、選択した.cファイルでグローバルを定義します。

グローバルを参照する必要がある場所には、その.hを含めてください。リンカは、それぞれの.objファイルへの参照を解決します。

実際、グローバルが少ないほど、誰がそれらを使用するかを追跡する際の正気度が高くなります。

于 2012-11-08T23:17:01.730 に答える
1

1つのオプションは、file1.cではなくfile1.hにglobal_variables.hを含めることです。それが良い解決策であるかどうかは、ソースツリーによって異なります。

于 2012-11-08T21:53:58.800 に答える