我想在宏中获取一个字符串数组。 首先:这可能吗?
如果是,我可以根据索引逐个调用它们吗?
这样的事情:
#define VAR "abc", "def", "xyz"
然后当我想在某处使用“def”时,
FUNC(VAR[1]);
答案 0 :(得分:2)
可能是我的代码对您有帮助:
#include<stdio.h>
#include<stdlib.h>
#define STRING_ARRAY "ONE", "TWO", "THREE", "NULL"
int main(){
char* STRING[] = {STRING_ARRAY};
int i=0;
scanf("%d",&i);
printf("%s\n",STRING[i]);
return EXIT_SUCCESS;
}
这也有效:
:~$ gcc x.c -o x
:~$ ./x
1
TWO
e:~$ ./x
2
THREE
只有在重新编译时才需要更改MACRO。
答案 1 :(得分:1)
#define VAR(...) const char *FOO[] = { __VA_ARGS__ }
...
VAR("abc", "xyz");
printf("%s\n", FOO[0]);
但请注意:
答案 2 :(得分:0)
宏将扩展为右侧的文本,因此请尝试自己回答您的问题。
这是一种尝试理解宏观的方法:
FUNC(VAR[1]); <=> FUNC("abc", "def", "xyz"[1]);
右边的人会做你期望的吗?没有?那么你不能像这样使用它。但是,您可以将其用于静态数组启动,然后通过索引访问数组。
编辑:我建议您使用MACRO:char* a[] = {VAR};
FUNC(a[0]);
答案 3 :(得分:0)
从C99开始,您可以使用复合文字
#define VAR ((char const*[]){ "abc", "def", "xyz" })
然后将其用作VAR[2]
左右。
复合文字类似于初始化程序的强制转换,这里是基类型char const*
的数组。 const
很重要,这样您就不会无意中尝试修改字符串文字。
任何现代编译器都应该能够将该数组和字符串文字的所有不同实例都折叠到一个实例中。