我可以从静态const char *数组中定义以下宏“unstringifying”吗?

时间:2013-02-14 22:43:04

标签: c++ c boost macros c-preprocessor

我在.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我会有点想法......

3 个答案:

答案 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;

不幸的是,只有在传入12等常量时才有效...变量不起作用。

或......

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)]