#define一个带索引的数组值

时间:2015-09-21 08:54:08

标签: c++ arrays

出于遗留原因,我需要维护旧的数组结构,但编译器告诉我,我的'表达式语法'存在问题。

这就是我所拥有的:

#define Array[GlobalIndexVariable]    Get(GlobalIndexVariable)->SubType;

Get返回一个指向结构的有效指针,该结构包含SubType

现在我想象这会占用Array[GlobalIndexVariable]的每个场合并简单地将其转换为函数调用,但显然我错了。

我甚至不知道在这种情况下要搜索什么,所以一点点的帮助将受到高度赞赏。

非常感谢。

编辑: 自从被问及以来,这是引发错误的一条线:

LocalVariable = Array[GlobalIndexVariable];

我想强调一点,我不打算将其变为macro,而只是想将Array[GlobalIndexVariable];替换为Get(GlobalIndexVariable),以及其他任何其他内容如果使用GlobalIndexVariable,替换将失败并引发不同的错误。

编辑:

只是为了确保我被理解:

现在我有4个类型为int的长数组。我想将这些内容填充到一个结构中以标记它们属于一起(它们描述同一事物的不同方面)但是我需要一个批量解决方案来处理以前的代码片段(几千次)。

旧:

int Index = 2;
int Array1[ANZ] = { 0, 1, 2 };
int Array2[ANZ] = { 0, 1, 2 };
int Array3[ANZ] = { 0, 1, 2 };
int Array4[ANZ] = { 0, 1, 2 };
if(Array1[Index] == 2) //doSomething

新:

struct {
    int Type, Conf, Foo, Bar;
};
if(Array1[Index] == 2) //doSomething

如果不触及Array1[Index] == 2,是否可以使用定义或其他内容来获得与旧代码完全相同的行为?

3 个答案:

答案 0 :(得分:2)

使用自定义类型,您可以

struct MyType
{
    int& operator[](int index) const { return Get(GlobalIndexVariable)->SubType; }
};

#define Array MyType{}

然后

Array[GlobalIndexVariable]

将替换为

MyType{}[GlobalIndexVariable]

将调用

Get(GlobalIndexVariable)->SubType;

答案 1 :(得分:1)

您的问题出在#define

#define Array[GlobalIndexVariable]    Get(GlobalIndexVariable)->SubType;

[]不是宏调用的有效语法。如果你正在做C ++,你可以为你的数组类型编写一个operator []。如果你在C中你有点受约束。你可能不得不用圆括号而不是方括号替换所有东西。

答案 2 :(得分:1)

我会进行替换,写下类似

的内容
#ifdef USE_OLD_SYNTAX
# define GET_ARRAY_VALUE(globalIndex) Array[globalIndex]
#else
# define GET_ARRAY_VALUE(globalIndex) Get(globalIndex)->SubType;
#endif

然后在代码中使用GET_ARRAY_VALUE,并通过查找并替换以前的代码,使用USE_OLD_SINTAX检查您要使用的定义。

但也许在没有宏的情况下,在代码中找到并替换它可能更简单。