如何使用C宏切割多个部分的字符串?

dri*_*ker 1 c macros

我想使用宏填充多维数组,以便使用它的人认为他们正在使用一个函数并只传递一个字符串.宏将使用此字符串并在编译时将其转换为使其显示为多维数组,如下所示:

make_array ("string1,{string2,{string3,{...,{stringN");
Run Code Online (Sandbox Code Playgroud)

因此宏将把这个函数替换为多维数组,并在遇到任何地方时剪切该字符串,{.上面的代码会变成这样的:

make_array = { "string1", "string2", "string3", ..., "stringN"};
Run Code Online (Sandbox Code Playgroud)

我正在使用GCC; 我怎么能做到这一点?

更新:我以为我可以使用宏来排除字符串的引号,所以我会有一个没有文本的字符串,我可以在宏中编辑字符串,但GCC不接受宏的声明来替换双引号(如图所示)下面).

#define macro_array ( "text") text
Run Code Online (Sandbox Code Playgroud)

因此,文本将出现没有双引号,我可以找到,{标记并剪切它,然后使用stringify将字符串转回.

Jon*_*ler 8

您可以使用C99和宏中的变量参数得到适当的近似值:

资源

#define make_array(name, dim1, dim2, ...) \
            static char name[dim1][dim2] = { __VA_ARGS__ }

make_array(mine, 2, 2, "abc", "def", "ghi", "jkl");
Run Code Online (Sandbox Code Playgroud)

产量

$: gcc -E xx.c
# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"

static char mine[2][2] = { "abc", "def", "ghi", "jkl" };
$
Run Code Online (Sandbox Code Playgroud)

但是,您无法按要求在预处理器中轻松拆分字符串 - 这只是作业的错误工具.

  • 这应该就是答案. (2认同)

Oli*_*rth 5

您不能使用宏进行字符串处理。

我不确定我确切地知道您想做什么,但这可能最好通过一个函数来实现。

  • @drigo:你不能。也许您应该修改您的问题,以解释您试图通过所有这些“实现”的事情。这可以帮助您获得更好的答案。 (3认同)