94

私たちの C コード ベース全体で、すべてのマクロが次のように定義されていることがわかります。

#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#endif

#ifndef BEEPTRIM_ROLL_RATE_DEGPS
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#endif

#ifndef FORCETRIMRELEASE_HOLD_TIME_MS
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#endif

#ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f
#endif

マクロを定義するだけでなく、これらの定義チェックを行う理由は何ですか?

#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#define BEEPTRIM_ROLL_RATE_DEGPS                    0.2f
#define FORCETRIMRELEASE_HOLD_TIME_MS               1000.0f
#define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS       50.0f

この慣行については、Web のどこにも説明がありません。

4

7 に答える 7

51

コメントで言ったように、この状況を想像してください。

foo.h

#define FOO  4

defs.h

#ifndef FOO
#define FOO 6
#endif

#ifndef BAR
#define BAR 4
#endif

bar.c

#include "foo.h"
#include "defs.h"

#include <stdio.h>

int main(void)
{
    printf("%d%d", FOO, BAR);
    return 0;
}

印刷します44

ただし、条件ifndefがそこにない場合、結果はマクロの再定義のコンパイル警告になり、出力されます64

$ gcc -o bar bar.c
In file included from bar.c:2:0:
defs.h:1:0: warning: "FOO" redefined [enabled by default]
 #define FOO 6
 ^
In file included from bar.c:1:0:
foo.h:1:0: note: this is the location of the previous definition
 #define FOO 4
 ^
于 2015-09-04T13:02:27.980 に答える
7

C プロジェクトは、複数のソース ファイルに存在します。単一のソース ファイルで作業する場合、チェックは (そして実際には) 意味がないように見えますが、大規模な C プロジェクトで作業する場合は、定数を定義する前に既存の定義をチェックすることをお勧めします。アイデアは単純です。その特定のソース ファイルで定数が必要ですが、別のソース ファイルで既に定義されている可能性があります。

于 2015-09-04T12:59:39.010 に答える
1

使用する

#ifndef BEEPTRIM_PITCH_RATE_DEGPS
#define BEEPTRIM_PITCH_RATE_DEGPS                   0.2f
#endif

ユーザーは、コマンド ライン引数 (gcc/clang/VS 内) を使用してマクロの値を定義できます-DBEEPTRIM_PITCH_RATE_DEGPS=0.3f

もう一つ重要な理由があります。プリプロセッサ マクロを別の方法で再定義するとエラーになります。this answer to another SO question を参照してください。#ifndefチェックを行わない-DBEEPTRIM_PITCH_RATE_DEGPS=0.3fと、コンパイラの呼び出しで がコマンド ライン引数として使用された場合、コンパイラはエラーを生成する必要があります。

于 2015-09-09T00:34:20.310 に答える