我正在寻找一个定义结构的解决方案,用户可以在示例中启用/禁用struct成员(伪代码):
#define DEF_STRUCT_1(NAME,VAL1,VAL2) \
struct my_struct_t \
{ \
#if(NAME == TRUE) \
bool name; \
#endif \
#if(VAL1 == TRUE) \
bool val1; \
#endif \
#if(VAL2 == TRUE) \
bool val2; \
#endif \
} instance1
void main() {
DEF_STRUCT_1(TRUE,FALSE,TRUE);
instance1.name = true;
//instance1.val1 = false; // error, unavailable
instance1.val2 = false;
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是多么有用,但以下应该按照你的要求做:
#define CONDITIONAL_TRUE(code) code
#define CONDITIONAL_FALSE(code)
#define DEF_STRUCT_1(NAME,VAL1,VAL2) \
struct my_struct_t \
{ \
CONDITIONAL_##NAME(bool name;) \
CONDITIONAL_##VAL1(bool val1;) \
CONDITIONAL_##VAL2(bool val2;) \
} instance1
int main() {
DEF_STRUCT_1(TRUE,FALSE,TRUE);
instance1.name = true;
//instance1.val1 = false; // error, unavailable
instance1.val2 = false;
}
Run Code Online (Sandbox Code Playgroud)
所有TRUE/ FALSE参数必须在编译时可用.如果您希望在同一程序中使用这些参数的多个版本,则还应将结构名称作为参数.
由于您说这是用于库,因此不清楚您是如何规划库代码以便能够访问此结构的,因为它需要知道哪些成员可用.这显着降低了该方法的有效性.
库使用的一种更常用的方法是使用可由库用户编辑的config.h文件,其定义如:#define USE_NAME_MEMBER 1.然后你可以struct用#if指令做一个正常的定义:
//in mylibrary.h:
#include <mylibrary_config.h>
struct my_struct_t {
#if USE_NAME_MEMBER
bool name;
#endif
/...
};
Run Code Online (Sandbox Code Playgroud)
然后,您还可以#if在访问该name成员的任何库代码周围放置指令.