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

然后将 proto.h 包含到所有需要它的 *.c 文件中typedef

或者我应该将 stdint.h 包含到我的所有 *.c 文件中吗?

4

2 回答 2

10

这是正确的,但由于多种原因不是最佳解决方案。

  1. 整理这个 typedef 列表需要额外的工作。他们已经在stdint.h
  2. 您的 typedef 在某些架构上不正确,并且您没有对此进行任何检查。如果有人看到uint32_t,他们希望它在任何架构上都是 32 位无符号整数;这将是一个令人讨厌的错误。
  3. 您的文件的用户不清楚proto.h它是否包含 stdint.h。有人会说你应该包含尽可能少的文件;在我看来,更重要的是要清楚。删除proto.h用户的 C 文件中的包含应该只需要删除对其中声明的函数的引用,而不是添加 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 回答