我在.c
文件中有以下内容(这是一个小得多的数组来举例说明):
static const char* __someNames[] =
{
"Fox",
"Wulf",
"Cat"
};
然后我会定义一个像这样的宏:
#define EXAMPLE(N) XXX
我希望XXX在没有__someNames[N]
的情况下被"
取代..我想要
#define EXAMPLE(1)
扩展为:
Wulf
我该如何解决这个问题?
修改
一些很酷的想法。这更多是出于对我想要做的好奇心的好奇心。我喜欢#include“file.h#两次使用重新定义的宏的想法......如果我也可以使用boost预处理器(我添加了c ++和boost标签来提问) - 我是否可以绕过额外的“file.h”?每个字符串#define的字符串也很酷,但考虑到有多少#defines我会有点想法......
答案 0 :(得分:7)
我认为你的X问题的解决方案(你问过Y解决方案的方法)就是把这个东西转过来并使用宏来放入字符串,然后使用相同的宏重新定义来做任何其他的事情你想做。
例如:
#define EXAMPLE(x) #x,
static const char* __someNames[] =
{
#include "file.h"
};
#undef EXAMPLE
#define EXAMPLE(x) x,
enum animals
{
#include "file.h"
};
其中file.h包含:
EXAMPLE(Fox)
EXAMPLE(Wulf)
EXAMPLE(Cat)
答案 1 :(得分:3)
使用标准C或C ++预处理器无法做到这一点。
预处理器扫描代码中的标识符,如果标识符与宏匹配,则会扩展宏。在这种情况下,扩展的宏实际上是数组名称,后跟括号中的输入数字。
这是预处理器工作方式的限制!
解决方法是这样的......
#define EXAMPLE_1 Wolf
#define EXAMPLE_2 Dog
#define EXAMPLE_3 Cat
#define EXAMPLE_X(n) EXAMPLE_##n
// Then say
EXAMPLE_X(1); // will put Wolf;
int EXAMPLE_X(2) = 0;// expands to int Dog = 0;
不幸的是,只有在传入1
或2
等常量时才有效...变量不起作用。
或......
static const char* __someNames[] =
{
#define __someNames_1 Fox
"Fox",
#define __someNames_2 Wulf
"Wulf",
#define __someNames_3 Cat
"Cat"
};
#define EXAMPLE_X(n) __someNames_##n
这将以您期望的方式工作并保持相同的方案,但它会为大数组提供大量定义!
答案 2 :(得分:-1)
#define EXAMPLE(_x) __someNames[(_x)]