これは正しいですが、いくつかの理由から最善の解決策ではありません。
- この typedef のリストを整理するには、追加の作業が必要です。彼らはすでに入ってい
stdint.h
ます。
- 一部のアーキテクチャでは typedef が正しくなく、そのためのチェックがありません。誰かが を見た場合
uint32_t
、彼らはそれがどのアーキテクチャでも 32 ビットの unsigned int であることを期待しています。これは追跡するのが厄介なバグです。
- ファイルのユーザーには、
proto.h
stdint.h が含まれていることがわかりません。できるだけ少ないファイルを含める必要があると言う人もいます。私の意見では、明確にすることがはるかに重要です。ユーザーの C ファイルへのインクルードを削除するproto.h
には、stdint.h のインクルードを追加するのではなく、その中で宣言されている関数への参照を削除するだけでよいはずです。明確にするためにファイルに追加する必要があり.c
ます。彼らも同じことをしたいと思うでしょう。
- 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);
}