C预处理器-在编译时向结构添加元素
我试图想出一种在编译时将元素添加到结构中的方法,但是要在另一个文件中定义它。例如: defA.h:C预处理器-在编译时向结构添加元素,c,c-preprocessor,C,C Preprocessor,我试图想出一种在编译时将元素添加到结构中的方法,但是要在另一个文件中定义它。例如: defA.h: typedef struct A { int element1; int element2; } A; otherfile.c: #include "defA.h" typedef struct B { int element1; } B; ADD_ELEMENT_TO(A, B, element3) 将导致: struct A { int element1
typedef struct A {
int element1;
int element2;
} A;
otherfile.c:
#include "defA.h"
typedef struct B {
int element1;
} B;
ADD_ELEMENT_TO(A, B, element3)
将导致:
struct A {
int element1;
int element2;
B element3;
};
有人能想出一个方法来达到这个或类似的目的吗?我希望能够通过选择编译
otherfile.c
或不使用构建的其余部分来控制这一点。任何使用c预处理器功能的解决方案都会在声明结构的地方造成混乱。例如:
主要来源/标题:
#include "SpecialSauce.h"
…
typedef struct A {
int element1;
int element2;
SpecialStuff
} A;
如果客户刚刚购买了基础软件,SpecialSause.h包含:
#define SpecialStuff
#define SpecialStuff int element3;
如果客户支付额外费用,SpecialSause.h包含:
#define SpecialStuff
#define SpecialStuff int element3;
当然,根据软件的版本,需要使用或不使用element3
的代码
所有这些都可以由预处理器指令控制,通过适当的处理,通常可以使其不太混乱。但商业压力往往排除了这一点,并导致软件变得更加混乱,维护被忽视。因此,这些乱七八糟的东西会变得丑陋和昂贵
另一种方法是保留主源文件,并使用它们生成具有选定选项的源文件。只有生成的源文件才会提供给客户,而且他们不会有难看的预处理器条件。但是,这就需要软件来处理主源文件,而主源文件本身必须进行维护,并且主源文件仍然必须具备某种条件,因为它们在您的控制下,因此您可以保持良好的状态,但是,现实世界中的软件有变得混乱的趋势。您试图解决什么问题?希望某些结构的内容依赖于条件编译是很正常的,但大多数情况下,只需使用包含或不包含所需成员的
#if
语句即可。或者可以定义一个宏,该宏条件扩展为所需成员的声明或空字符串,然后在结构声明中使用该宏。这样的事情对你来说够了吗?如果没有,你为什么要尝试这种更复杂的方法;它将为您实现什么目标?我知道我可以使用#if
有条件地将元素3
添加到结构中,但是我正在寻找一种更优雅的方式将其放置在那里。假设我向客户交付源代码,但他们只为某些功能付费。如果他们还没有为otherfile.c
中的代码付费,我要么就必须提供给他们,要么以某种方式清理我的代码。如果与otherfile.c
相关的定义仅通过将其包含在构建中而添加到结构中,则可以避免该问题。我知道这会导致调试等方面的问题,但我很想看看会出现什么问题。当处理defA.h
时遇到定义的}
时,struct A
的类型是完整的和最终的。之后就不能再修改了。您可以(但不应该)在函数作用域(或函数内部的作用域)创建新类型,但它不会修改现有的结构a
;它只会隐藏(隐藏)另一个声明。如果希望在A
中嵌入B
,则必须将结构A
的定义推迟到结构B
的定义之后。