Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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,目前我正在编写一些易于扩展的代码。 要添加新条目,用户必须添加: 新条目的名称 新条目的大小 名称仅用于填充枚举,大小用于保留一些空间来存储枚举的值 坦率地说,我甚至不确定这是否可行,因为我实际上是在问预处理器是否可以正确地分割/分离符号,并将其转换为某种样板代码 例如,我想添加以下条目: DECLARE_ENTRY(downlinkCounter, sizeof(uint32_t)) DECLARE_ENTRY(uplinkCounter, sizeof(uint32_t)) 或许: #de

目前我正在编写一些易于扩展的代码。 要添加新条目,用户必须添加:

  • 新条目的名称
  • 新条目的大小
  • 名称仅用于填充枚举,大小用于保留一些空间来存储枚举的值

    坦率地说,我甚至不确定这是否可行,因为我实际上是在问预处理器是否可以正确地分割/分离符号,并将其转换为某种样板代码

    例如,我想添加以下条目:

    DECLARE_ENTRY(downlinkCounter, sizeof(uint32_t))
    DECLARE_ENTRY(uplinkCounter, sizeof(uint32_t))
    
    或许:

    #define ENTRIES downlinkCounter, sizeof(uint32_t), uplinkCounter, sizeof(uint32_t)
    
    或:

    (最后一个选项不是首选,我更喜欢将名称和大小紧密配对)

    我希望在头文件中扩展到以下内容:

    typedef enum {
        downlinkCounter,
        uplinkCounter,
    } eEntries_t;
    
    要在源文件中展开到该位置,请执行以下操作:

    typedef struct {
        uint8_t downlinkCounter[sizeof(uint32_t)];
        uint8_t uplinkCounter[sizeof(uint32_t)];
    } sEntries_t;
    
    我甚至可以用C预处理器来做这个吗?还是我要把这个打印出来


    谢谢你的帮助

    最好在编译之前运行一些C代码生成脚本,以便获得清晰可读的代码

    否则,可以使用各种宏技巧(即所谓的“X宏”)集中处理前常量。它们有助于避免代码重复,但会使所有内容变得难以阅读。在这种情况下:

    #define ENTRY_LIST(X)                   \
      X(downlinkCounter, sizeof(uint32_t))  \
      X(uplinkCounter,   sizeof(uint32_t))  \
    
    然后可以使用各种宏调用此列表以生成特定的代码段:

    #define ENTRY_ENUM(name, dummy) name,
    typedef enum {
      ENTRY_LIST(ENTRY_ENUM)
    } eEntries_t;
    
    #define ENTRY_STRUCT(name, size) uint8_t name[size];
    typedef struct {
      ENTRY_LIST(ENTRY_STRUCT)
    } sEntries_t;
    
    预处理为:

    typedef enum {
      downlinkCounter, 
      uplinkCounter,
    } eEntries_t;
    
    typedef struct {
      uint8_t downlinkCounter[sizeof(uint32_t)]; 
      uint8_t uplinkCounter[sizeof(uint32_t)];
    } sEntries_t;
    

    预处理器相当愚蠢。最好用脚本语言进行预构建处理。考虑使用等等。要生成你想要的C代码,那么答案似乎是否定的?
    typedef enum {
      downlinkCounter, 
      uplinkCounter,
    } eEntries_t;
    
    typedef struct {
      uint8_t downlinkCounter[sizeof(uint32_t)]; 
      uint8_t uplinkCounter[sizeof(uint32_t)];
    } sEntries_t;