我有一个Type_##type
依赖于某个宏 type_create 的类型:
#define type_create(type) { \
typedef struct { \
type* ptr, \
} Type_##type; \
我有一些依赖它的宏。现在我想知道我是否可以#ifndef
针对某个类型执行类似操作,例如,
#ifndef Type_int
type_create(int);
#endif
除类型外。
我有一个Type_##type
依赖于某个宏 type_create 的类型:
#define type_create(type) { \
typedef struct { \
type* ptr, \
} Type_##type; \
我有一些依赖它的宏。现在我想知道我是否可以#ifndef
针对某个类型执行类似操作,例如,
#ifndef Type_int
type_create(int);
#endif
除类型外。
C 预处理器对其正在操作的代码的 C 语义一无所知。它无法确定在特定位置是否存在 C 数据类型的声明。C 语言指定了功能测试宏来针对语言的可选功能执行此类测试,但作为一名 C 程序员,您应该充分了解您自己声明的所有标识符。
按照惯例,人们会将所有需要的文件范围声明放在源文件的顶部,要么直接放在顶部,要么通过
#include
在该位置添加头文件来实现。这样做的好处之一是,如果您不确定声明的内容,可以很容易地检查。对于任何直接声明而不是通过头文件声明的内容,我发现将声明放在所有“#include
s”之后,并按类型分组会很有帮助:先是类型,然后是对象,然后是函数原型,最后是函数定义。使用宏来编写某些类型定义并不会使其变得不合适,但您可能希望将它们分组到更大的类型声明组中。另外,如果您想使用宏来声明多个相关的内容,例如一个结构体类型及其关联的多个函数的原型,那么使用一个宏来声明它们可能更合理。声明一些您从未引用过的函数、类型或外部对象也无妨,只要这些声明不是定义即可。