C MacroMagic - 结构定义

aph*_*rdt 0 c c-preprocessor

我正在寻找一个定义结构的解决方案,用户可以在示例中启用/禁用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)

int*_*jay 5

我不确定这是多么有用,但以下应该按照你的要求做:

#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成员的任何库代码周围放置指令.