我想在宏中获取一个字符串数组。首先:这可能吗?
如果是的话,我可以在使用它们时根据索引一一调用它们吗?
像这样的东西:
#define VAR "abc", "def", "xyz"
然后当我想在某处使用“def”时,
FUNC(VAR[1]);
可能是我的代码对你有帮助:
#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。
#define VAR(...) const char *FOO[] = { __VA_ARGS__ }
...
VAR("abc", "xyz");
printf("%s\n", FOO[0]);
但请注意:
从 C99 开始,您可以使用复合文字
#define VAR ((char const*[]){ "abc", "def", "xyz" })
然后使用它VAR[2]
左右。
复合文字类似于初始化器的强制转换,这里这是一个基类型的数组char const*
。这const
很重要,这样您就不会无意中尝试修改字符串文字。
任何现代编译器都应该能够将该数组和字符串文字的所有不同出现折叠到一个实例中。
宏将扩展到右侧的文本,因此请尝试自己回答您的问题。
这是一种尝试理解宏的方法:
FUNC(VAR[1]); <=> FUNC("abc", "def", "xyz"[1]);
右边的会做你期望的吗?不?所以你不能像这样使用它。但是,您可以将其用于静态数组初始化,然后通过索引访问数组。
编辑:这是我建议您使用 MACRO 的方式:
char* a[] = {VAR};
FUNC(a[0]);