如何以及在何处在头文件中包含stdint.h类型定义?

时间:2012-07-05 15:43:02

标签: c header

如果我希望包含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包含在需要此typedef的所有* .c文件中?

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

2 个答案:

答案 0 :(得分:9)

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

  1. 需要额外的工作来策划这个typedef列表。他们已经在stdint.h
  2. 您的typedef在某些体系结构上不正确,并且您没有对此进行任何检查。如果有人看到uint32_t,他们希望它在任何架构上都是32位无符号整数;这将是一个令人讨厌的错误追踪。
  3. 您的proto.h文件的用户不清楚它包含stdint.h。有些人会说你应该尽量少包含文件;在我看来,明确更重要。删除用户C文件中的proto.h包含应该只需要删除对其中声明的函数的引用,而不是添加stdint.h的包含。为了清楚起见,您应该将其添加到.c文件中,他们也希望这样做。
  4. 你在你的typedef周围添加了额外的包含守卫,这些都不是必需的 - stdint.h(以及你将使用的所有其他标题)已经包含了包含守卫。
  5. 由于这些原因,我建议在任何头文件中需要来自另一个头的定义(例如,在函数原型中使用宏或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);
    }
    

答案 1 :(得分:2)

不,您最好在此文件中使用#incldue <stdint.h>,而不是每个使用此标头的文件。