2

Linux プラットフォームで C 言語でプログラミングしています。私が知りたいのは、宣言の順序と#definesヘッダー ファイルである必要があります。

たとえば、ヘッダーファイルに次のものが含まれている場合、これらすべての宣言、マクロのような関数、 exteren 宣言などを配置するのに最適な順序を教えてください。

これは、読みやすさとコーディング標準の観点から、これらすべてをヘッダー ファイルに適切に配置するのに非常に役立ちます。

以下はサンプルヘッダーファイルです(以下を適切な順序で並べたいです):

 #include <pthread.h>                   //  Including Header files 
 #include <signal.h>

 #define IMAGE_DIRECTORY                 "Abcdefgh..."   //  Providing #defines 
 #define FAILED_TO_RECOGNIZE             "Xykbkksk..."
 #define PROGRESS_FRAME_COLOR            "#8e8ea1"
 #define FRAME_BG_COLOR                  "#7c90ac"      

 #define PRINT_FUNCTION_NAME fprintf(stderr, 
                   "CTRL IN FUNCTION : %s\n",__func__);   // Macro like functions 
typedef struct {                                           
        int userId;                                      // Structure
         char name[32], rollNo[32];
         char class[16], section[16];
         unsigned long Id;
 }data_type;

int noOfUsersList=0, usersListCount=0;                   // Global variables 
4

3 に答える 3

4

私はこれを何年も行っていませんでしたが、Unix、MS.DOS、OS/2、NetWare、および Windows を同時に開発していたときに、この方法を開発しました。

  1. 言語 #include
  2. オペレーティング システム #includes
  3. #X11 などの他のサブシステムからのインクルード。
  4. 私自身のアプリケーション #includes.
  5. このソース ファイルの独自のローカル #defines。
  6. このファイルに対する私自身の前方宣言。

(1) と (2) を逆にすることもできますが、この順序がかなりの数のコンパイラとオペレーティング システムで最適に機能することがわかりました。

于 2012-06-29T06:30:29.600 に答える
1

のマクロ定義は宣言で#defineはありません。唯一の要件は、マクロを使用する前にマクロを定義する必要があることです。それらは、コンパイルユニットの終了、または明示的#undef(または再定義...)まで定義されたままになります。

私の文体の慣習は、ステートメントのようなマクロを、構文のような「関数」を持つものとして定義することです。

 #define PRINT_FUNCTION_NAME() fprintf(stderr, \
     "CTRL IN FUNCTION: %s @%s:%d\n", __func__, __FILE__, __LINE__)

空の仮マクロ引数(つまり最初())と終了セミコロンの欠如に注意してください(これは、ステートメントなどの準関数呼び出しとして使用するため)。 デバッグメッセージでの およびPRINT_FUNCTION_NAME();の使用にも注意してください。__FILE____LINE__

多くの場合、ステートメントのようなマクロはdo{ 何か } while(0)です。これは、lookのようなステートメントを持ち、常にステートメントとして使用できる構文であるためです(thenの一部としてif、またはelseブランチ内などを含む)。からの例<ncurses.h>

#define getsyx(y,x) do { if (newscr) { \
             if (is_leaveok(newscr)) \
            (y) = (x) = -1; \
             else \
             getyx(newscr,(y), (x)); \
        } \
        } while(0)
于 2012-06-29T05:58:24.830 に答える
1

コーディング スタイルは主観的なものであり、個人的には以下に説明するルールと方法を使用しますが、それは私自身の意見であり、絶対的な真実ではないことに注意してください。それでも、それらは長年の経験に基づいており、場合によっては広く認識されているコーディング標準 (MISRA、CERT など) に基づいています。

ルール:

  • C プログラミングは「コード モジュール」で行われ、すべてのモジュールは .h ファイルと .c ファイルで構成されます。
  • #includes は常に .h ファイルにあり、.h ファイルにはありません。.h ファイルはパブリックと見なされる必要があるためです。モジュールを使用する人に、どのような依存関係があるかを知ってもらいたいと考えています。
  • C で非 const グローバル変数を使用する理由は決してないため、非 const グローバルと extern を配置する場所は私には関係ありません。
  • .h ファイルには定義を含めないでください。これは、プログラムの設計が悪いだけでなく、解決が困難なリンカ エラーを多数発生させる優れた方法でもあります。

.h ファイルでは、次の項目を指定された順序で表示できます。

  • ヘッダーガード開始。( #ifndef MYHEADER_H...)
  • ライブラリ #includes.
  • その他の #includes。
  • #pragmas で設定されたコンパイラ オプションなどの実装固有のコンパイラ設定。
  • #defines として公開されている数値定数。
  • 公開マクロ。
  • 不透明な型を含む公開型の定義。
  • パブリック定数の宣言 ( として宣言extern const)。
  • インライン関数定義 (まれな特殊なケースです。可能であれば避けてください)。
  • 関数プロトタイプ。
  • ヘッダー ガードの終了。#endif

.c ファイルでは、次の項目を指定された順序で表示できます。

  • 独自の対応する .h ファイルを含めます。
  • #defines 内のプライベート数値定数。
  • プライベート マクロ。
  • 対応する .h ファイルで不完全型として宣言された不透明型の定義。
  • プライベート タイプの定義。
  • パブリック定数の定義 ( extern const.h ファイルで宣言)。
  • プライベート定数の定義 ( static const)。
  • ファイル スコープでのプライベート変数の定義 ( static)。
  • プライベート関数の宣言 ( として宣言static type func (type param);)
  • .h ファイルで宣言されたパブリック関数の定義。
  • プライベート関数の定義。
于 2012-06-29T08:05:14.160 に答える