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

时间:2011-01-09 19:33:46

标签: c macros

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

make_array ("string1,{string2,{string3,{...,{stringN");

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

make_array = { "string1", "string2", "string3", ..., "stringN"};

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

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

#define macro_array ( "text") text

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

5 个答案:

答案 0 :(得分:7)

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

来源

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

make_array(mine, 2, 2, "abc", "def", "ghi", "jkl");

输出

$: 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" };
$

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

答案 1 :(得分:4)

您无法使用宏进行字符串处理。

我不确定我到底知道你想要做什么,但这可能是通过一个功能最好的。

答案 2 :(得分:3)

算了。我看到太多的问题,如“如何让我的代码看起来像这样?”当实现优秀代码的问题应该是“如何使我的代码工作这样?”你想要实现的目标是什么?

如果要导入以您指定的奇怪表示法格式化的外部数据,数据是在运行时变化还是不变?在前一种情况下,您需要在程序中使用解析器并进行大量动态分配。在后一种情况下,您需要编写一个在编译主程序之前运行的程序,该程序将数据解析并转换为C.但是如果没有合理的理由让数据以这种奇怪的格式开头,那么您应该简单地写一下它从一开始就在C中,而不是试图迫使C看起来像其他东西。

答案 3 :(得分:1)

  1. 删除引号并使用可变参数宏
  2. 编写一个函数来拆分字符串并从宏中调用它
  3. 不要使用宏,只需创建一个静态内联函数。它同样快。

答案 4 :(得分:0)

正如Oli已经说过的那样,使用宏不可能进行这种字符串处理。连接和替换其他字符串与使用宏可以做的一样多。

我认为这里的答案是一个问题 - 为什么输入字符串必须是那种格式?编写所需的结果不需要比编写输入更多的努力,那么为什么要经历处理它的痛苦呢?