2013-02-14 101 views
0

我有,在.c文件,下面的(这是一个非常小的阵列举例):我可以从静态const char *数组中定义下面的宏“unstringifying”吗?

static const char* __someNames[] = 
{ 
    "Fox", 
    "Wulf", 
    "Cat" 
}; 

再后来我定义这样一个宏:

#define EXAMPLE(N) XXX 

在那里我会像由__someNames[N]没有" ..ie替代XXX,我想

#define EXAMPLE(1) 

扩大到:

Wulf 

我该怎么办?

编辑

一些很酷的想法。这更多是出于对知识的好奇,我想这样做。我喜欢用#include“file.h#两次重新定义宏的想法。如果我还可以使用boost预处理器(我添加了C++和boost标记来提问),我该怎么办? “file.h”呢?一个每串的#define也很酷,虽然略少的想法给我多少#define语句将有...

+2

听起来像一个完美的XY问题,“我有这个问题X,我认为解决的办法是Y,所以我会问如何做Y“。 – 2013-02-14 22:46:26

+0

为什么你想要它扩大到wulf?你打算如何使用它? – 2013-02-14 22:50:25

+0

顺便说一句'__'在标识符的开始处是为编译器/ C库实现保留的。 – 2013-02-14 22:53:11

回答

6

我认为你的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
#define EXAMPLE(_x) __someNames[(_x)] 
+0

如何除去'__someNames'中的字符串引号? – 2013-02-14 22:47:07

+0

它不会扩展到他们所要求的。 – 2013-02-14 22:49:30

+0

@MatsPetersson:这个问题询问了EXAMPLE(1)如何转化为静态常量char *数组__someNames的索引,以产生Wulf,该答案即为答案。如果我误解了这个问题,它确实是关于你是否可以索引到一个字符串数组并产生一个标识符,那么答案是“否。你不能在C预处理器中这样做”。 – SecurityMatt 2013-02-14 22:49:52

2

有没有办法在标准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等常量传递遗憾的是,只有工作......变量是行不通的。

OR ....

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 

,将工作你希望它并保持相同的方案发言权的方式,但它会放很多定义为大阵!

相关问题