我可以在 c99 中包含 local header 而不进一步膨胀命名空间吗?
Can I include local header in c99 without bloating the namespace further down the line?
有没有办法让我包含一个 c99 header 文件并且只能在我包含它的 header 中访问它?
我正在尝试创建一些 typedef 和宏,但我不希望它们通过它的 header 依赖项进一步膨胀命名空间。
这是我的意思的一个例子..
// l2kdef.h
#ifndef LIN32_L2KDEF_H
#define LIN32_L2KDEF_H
//have these only accessible in this header begin
#include <stdbool.h>
#include <stdlib.h>
#include <float.h>
#include <raylib.h>
//have these only accessible in this header end
//public types below
typedef char _Char;
typedef int8_t _I8;
typedef int16_t _I16;
typedef int32_t _I32;
typedef int64_t _I64;
typedef u_int8_t _U8;
typedef u_int16_t _U16;
typedef u_int32_t _U32;
typedef u_int64_t _U64;
typedef float _F32;
typedef double _F64;
typedef size_t _Enum;
typedef size_t _Size;
typedef struct _Col
{
_U8 r;
_U8 g;
_U8 b;
} _Col;
typedef struct _Img
{
_U8* data;
_U32 w;
_U32 h;
} _Img;
typedef struct _Tex
{
_U32 id;
_Img img;
} _Tex;
#define bool _Bool
#define char _Char
#define i8 _I8
#define i16 _I16
#define i32 _I32
#define i64 _I64
#define u8 _U8
#define u16 _U16
#define u32 _U32
#define u64 _U64
#define f32 _F32
#define f64 _F64
#define enum _Enum
#define size _Size
#define col _Col
#define img _Img
#define tex _Tex
#endif //LIN32_L2KDEF_H
根据C99标准:
If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope, which terminates at the end of the translation unit.
因此,无法阻止先前的类型定义在包括此头文件在内的源文件的其余部分中可见。
该标准还对 stdint.h
中定义的整数类型进行了如下说明:
The header <stdint.h> declares sets of integer types having specified widths, and defines corresponding sets of macros.
鉴于整数类型被定义为宏,在您使用 #undef
.
在程序中使用宏后,您应该能够取消定义它们
如果 objective 是强制开发人员使用此头文件中定义的自定义类型来代替 C99 类型,一个可能有效的技巧是创建宏来标识替换后的类型typedef
语句。
例如,在 typedef char _Char;
之后,可以放置宏 #define char (++)
,这将强制将来使用 char
的任何内容都必须由前者替换为 (++)
编译器。请注意,C99 标准不限制预编译器(第 7 阶段之前)翻译关键字的使用:
The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise.
旁注:
类型 bool
已在 stdbool.h
中定义,#define bool _Bool
正在此处重新定义。
几个类型标识符使用前导下划线指定。 C99 标准规定:
All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
An alternate option may be to add a trailing underscore rather than to use a leading underscore.
有没有办法让我包含一个 c99 header 文件并且只能在我包含它的 header 中访问它?
我正在尝试创建一些 typedef 和宏,但我不希望它们通过它的 header 依赖项进一步膨胀命名空间。
这是我的意思的一个例子..
// l2kdef.h
#ifndef LIN32_L2KDEF_H
#define LIN32_L2KDEF_H
//have these only accessible in this header begin
#include <stdbool.h>
#include <stdlib.h>
#include <float.h>
#include <raylib.h>
//have these only accessible in this header end
//public types below
typedef char _Char;
typedef int8_t _I8;
typedef int16_t _I16;
typedef int32_t _I32;
typedef int64_t _I64;
typedef u_int8_t _U8;
typedef u_int16_t _U16;
typedef u_int32_t _U32;
typedef u_int64_t _U64;
typedef float _F32;
typedef double _F64;
typedef size_t _Enum;
typedef size_t _Size;
typedef struct _Col
{
_U8 r;
_U8 g;
_U8 b;
} _Col;
typedef struct _Img
{
_U8* data;
_U32 w;
_U32 h;
} _Img;
typedef struct _Tex
{
_U32 id;
_Img img;
} _Tex;
#define bool _Bool
#define char _Char
#define i8 _I8
#define i16 _I16
#define i32 _I32
#define i64 _I64
#define u8 _U8
#define u16 _U16
#define u32 _U32
#define u64 _U64
#define f32 _F32
#define f64 _F64
#define enum _Enum
#define size _Size
#define col _Col
#define img _Img
#define tex _Tex
#endif //LIN32_L2KDEF_H
根据C99标准:
If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope, which terminates at the end of the translation unit.
因此,无法阻止先前的类型定义在包括此头文件在内的源文件的其余部分中可见。
该标准还对 stdint.h
中定义的整数类型进行了如下说明:
The header <stdint.h> declares sets of integer types having specified widths, and defines corresponding sets of macros.
鉴于整数类型被定义为宏,在您使用 #undef
.
如果 objective 是强制开发人员使用此头文件中定义的自定义类型来代替 C99 类型,一个可能有效的技巧是创建宏来标识替换后的类型typedef
语句。
例如,在 typedef char _Char;
之后,可以放置宏 #define char (++)
,这将强制将来使用 char
的任何内容都必须由前者替换为 (++)
编译器。请注意,C99 标准不限制预编译器(第 7 阶段之前)翻译关键字的使用:
The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise.
旁注:
类型 bool
已在 stdbool.h
中定义,#define bool _Bool
正在此处重新定义。
几个类型标识符使用前导下划线指定。 C99 标准规定:
All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use. An alternate option may be to add a trailing underscore rather than to use a leading underscore.