在 C 中创建和初始化具有可变长度宏的结构

标签 c macros

我正在尝试使用可变长度宏来创建和初始化结构。我希望能够使用“0”创建/初始化结构,然后使用可选传入的值初始化结构的某些字段。

这可能吗?我正在尝试以下操作:

#define INIT_ENTRY(x, ...) \
    entry_t x = {.id = 0, .age = 0} \
    x.id  = <I want to use arg1 here>
    x.age = <i want to use arg2 here if it exists> 

有没有办法做到这一点?

最佳答案

这可以通过参数计数和连接的组合来完成。

  1. 首先,您需要一个宏来计算它的参数,我将其称为 NARGS 这已被询问和回答 here .请注意,答案取决于编译器。

  2. 接下来您需要针对所有特定情况的一系列宏:

    #define INIT_ENTRY_0(x) entry_t x = {.id = 0, .age = 0}
    #define INIT_ENTRY_1(x, _id) entry_t x = {.id = _id, .age = 0}
    #define INIT_ENTRY_2(x, _id, _age) entry_t x = {.id = _id, .age = _age}

  3. 您还需要一个连接宏:

    #define CONCAT(a, b) a##b

  4. 最后,使用连接来选择正确的:

    #define INIT_ENTRY(x, ...) CONCAT(INIT_ENTRY_, NARGS(__VA_ARGS__))(x, #__VA_ARGS__)

关于在 C 中创建和初始化具有可变长度宏的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765025/

相关文章:

c - 无法修改c中堆栈上的字符串

java - 在 Android Ndk 中用 C 创建 java 对象

c - _construct in C,一个在oop项目中使用的宏

macros - lisp:何时使用函数与宏

比较字符数组的地址

c - 超出范围是否释放了(字符)数组的内存?

c - Linux内核: define function that inside calls 'jiffies'

visual-studio - 如何使用 Visual Studio 扩展 VC++ 宏引用?

user-controls - Umbraco 4.7.0 宏在通过 Richtext 编辑器插入时不呈现

c - 为什么我的宏不能编译?