Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C预处理器-在编译时向结构添加元素_C_C Preprocessor - Fatal编程技术网

C预处理器-在编译时向结构添加元素

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

我试图想出一种在编译时将元素添加到结构中的方法,但是要在另一个文件中定义它。例如:

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;
    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
的定义之后。