6

proto.h が含まれているすべての *.c ファイルをint32_t代わりに使用するint場合は、次のヘッダー ファイルにこれを書き込むのが正しい方法ですproto.h

#ifndef PROTO_H_INCLUDED
#define PROTO_H_INCLUDED
#ifndef STDINT_H_INCLUDED
#define STDINT_H_INCLUDED
typedef int int32_t;
typedef unsigned int uint32_t;
typedef size_t uint32_t;
#endif

そして、これを必要とするすべての *.c ファイルに proto.h を含めますtypedefか?

それとも、すべての *.c ファイルに stdint.h を含める必要がありますか?

4

2 に答える 2

10

これは正しいですが、いくつかの理由から最善の解決策ではありません。

  1. この typedef のリストを整理するには、追加の作業が必要です。彼らはすでに入っていstdint.hます。
  2. 一部のアーキテクチャでは typedef が正しくなく、そのためのチェックがありません。誰かが を見た場合uint32_t、彼らはそれがどのアーキテクチャでも 32 ビットの unsigned int であることを期待しています。これは追跡するのが厄介なバグです。
  3. ファイルのユーザーには、proto.hstdint.h が含まれていることがわかりません。できるだけ少ないファイルを含める必要があると言う人もいます。私の意見では、明確にすることがはるかに重要です。ユーザーの C ファイルへのインクルードを削除するproto.hには、stdint.h のインクルードを追加するのではなく、その中で宣言されている関数への参照を削除するだけでよいはずです。明確にするためにファイルに追加する必要があり.cます。彼らも同じことをしたいと思うでしょう。
  4. typedef の周りに追加のインクルード ガードを追加しましたが、これらは必要ありません。stdint.h (および使用する他のすべてのヘッダー) には既にインクルード ガードが含まれています。

これらの理由から、別のヘッダーからの定義が必要なヘッダー ファイル (関数プロトタイプでマクロや typedef を使用する場合など) では、次のようにファイルを構成することをお勧めします。

proto.h

#ifndef PROTO_H_INCLUDED
#define PROTO_H_INCLUDED

// Typedefs for prototypes
#include <stdint.h>

unit32_t proto(int32_t *value, size_t length);

#endif

proto.c

#include <stdint.h>
#include "proto.h"  // Forward declare functions in this file

unit32_t proto(uint32_t *value, size_t length)
{
    // Do something
}

main.c

#include <stdint.h>
#include "proto.h"

int main(int argc, char *argv[])
{
    uint32_t values[] = { 1, 2, 3 };
    uint32_t result;
    // Could do 'uint32_t result, values[] = { 1, 2, 3 };' (one line)
    // but this is better for clarity
    size_t len = sizeof(values) / sizeof(values[0]);

    proto(values, len);
}
于 2012-07-05T16:11:44.183 に答える
2

いいえ、#incldue <stdint.h>このヘッダーを使用するすべてのファイルではなく、このファイルで使用することをお勧めします。

于 2012-07-05T15:45:43.457 に答える