C语言 如何将多行代码组合成一行代码?

jaxagkaj  于 2023-02-21  发布在  其他
关注(0)|答案(2)|浏览(347)

演示代码如下所示:

#include <stdio.h>

#define DEMO(array) demo(array, sizeof(array) / sizeof(array[0]))

typedef struct Demo {
    const char *msg;
} Demo;

void demo(Demo list[], size_t list_size) {
    for (int i = 0; i < list_size; i++) {
        printf("%s\n", list[i].msg);
    }
}

int main() {
    Demo d[] = {
        {"Hello World"},
        {"Hello World"}
    };

    DEMO(d);
}

我想合并main函数中的代码,我想象合并的方式是这样的:

DEMO((Demo []){
  {"Hello World"},
  {"Hello World"}
});

我记得曾经在一个开源项目中看到过这种语法糖,但我不记得是哪个项目了。

jv4diomz

jv4diomz1#

你确实可以用一个复合文本参数调用宏,但是你应该在宏定义中更加小心,把扩展中参数的所有示例都括起来,除了函数参数:sizeof(array[0])导致参数(Demo[]){{"Hello World"}, {"Hello World"}}出现语法错误

#include <stdio.h>

#define DEMO(array) demo(array, sizeof(array) / sizeof((array)[0]))

typedef struct Demo {
    const char *msg;
} Demo;

void demo(Demo list[], size_t list_size) {
    for (int i = 0; i < list_size; i++) {
        printf("%s\n", list[i].msg);
    }
}

int main() {
    DEMO((Demo[]){{"Hello World"}, {"Hello World"}});
}

使用发布的定义,您仍然可以使用复合文本调用宏,但必须将其括在括号中以确保正确的计算:

DEMO( ( (Demo[]){ {"Hello World"}, {"Hello World"}} ) );
hs1rzwqc

hs1rzwqc2#

DEMO(((Demo[]){{"Hello World"},{"Hello World"}}));

相关问题