0

我在一个.c文件中有以下内容(这是一个小得多的数组来举例说明):

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,但想法稍微少一些......

4

3 回答 3

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)
于 2013-02-14T22:51:28.163 回答
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;

不幸的是,只有当你传入诸如1or之类的常量时才有效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

这将按照您期望的方式工作并保持相同的方案,但它会为大数组放置很多定义!

于 2013-02-14T22:49:11.730 回答
-1
 #define EXAMPLE(_x)  __someNames[(_x)]
于 2013-02-14T22:46:24.803 回答