我想使用宏填充多维数组,以便使用它的人认为他们正在使用函数并且只传递一个字符串。宏将使用此字符串,并在编译时将其转换为多维数组,如下所示:
make_array ("string1,{string2,{string3,{...,{stringN");
因此,宏会将此函数替换为多维数组,并在遇到,{
的任何地方剪切该字符串。上面的代码会变成这样的:
make_array = { "string1", "string2", "string3", ..., "stringN"};
我正在使用GCC;我怎么能做到这一点?
更新:我以为我可以使用宏来排除字符串的引号,所以我会有一个没有文本的字符串,我可以在宏中编辑字符串但是GCC不接受宏的声明来替换双引号(如下图所示)。
#define macro_array ( "text") text
因此文本将显示没有双引号,我可以找到,{
标记并将其剪切,然后使用stringify将字符串转回。
答案 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)
答案 4 :(得分:0)
正如Oli已经说过的那样,使用宏不可能进行这种字符串处理。连接和替换其他字符串与使用宏可以做的一样多。
我认为这里的答案是一个问题 - 为什么输入字符串必须是那种格式?编写所需的结果不需要比编写输入更多的努力,那么为什么要经历处理它的痛苦呢?