C++ #使用索引定义数组值

C++ #使用索引定义数组值,c++,arrays,C++,Arrays,出于遗留原因,我需要维护旧的数组结构,但是编译器告诉我我的“表达式语法”有问题 以下是我所拥有的: #define Array[GlobalIndexVariable] Get(GlobalIndexVariable)->SubType; Get返回指向结构的有效指针,该结构包含子类型 现在我想象这会占用Array[GlobalIndexVariable]的每一个场合,并简单地将其转换为函数调用,但显然我错了 我甚至不知道在这种情况下应该搜索什么,所以如果能提供一些帮助,我将不胜感

出于遗留原因,我需要维护旧的数组结构,但是编译器告诉我我的“表达式语法”有问题

以下是我所拥有的:

#define Array[GlobalIndexVariable]    Get(GlobalIndexVariable)->SubType;
Get
返回指向结构的有效指针,该结构包含
子类型

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

我甚至不知道在这种情况下应该搜索什么,所以如果能提供一些帮助,我将不胜感激

多谢各位

编辑: 既然有人问,下面是抛出错误的一行:

LocalVariable = Array[GlobalIndexVariable];
我想强调的是,我并不想把它变成一个
,而是想替换
数组[GlobalIndexVariable]Get(GlobalIndexVariable)
进行编码>,因此只要使用了
GlobalIndexVariable
以外的任何内容,替换就会失败并引发不同的错误

编辑:

只是为了确保我被理解:

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

旧的:

新的:


如果不触碰
Array1[Index]==2
,是否可以使用define或其他方法来获得与旧代码完全相同的行为?

您的问题在于
\define

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

[]不是宏调用的有效语法。如果你正在做C++,你可以为数组类型编写一个运算符[]。如果你在C语言中,你会有点不知所措。你可能不得不用圆括号代替方括号。

你的问题在于你的
#define

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

[]不是宏调用的有效语法。如果你正在做C++,你可以为数组类型编写一个运算符[]。如果你在C语言中,你会有点不知所措。您可能需要用圆括号而不是方括号来替换所有内容。

我将执行替换,编写如下内容

#ifdef USE_OLD_SYNTAX
# define GET_ARRAY_VALUE(globalIndex) Array[globalIndex]
#else
# define GET_ARRAY_VALUE(globalIndex) Get(globalIndex)->SubType;
#endif
然后在代码中使用
GET\u ARRAY\u VALUE
,并通过查找和替换以前的代码,使用
use\u OLD\u SINTAX
检查要使用的定义


但在代码中查找和替换可能更简单,根本不需要宏

#ifdef USE_OLD_SYNTAX
# define GET_ARRAY_VALUE(globalIndex) Array[globalIndex]
#else
# define GET_ARRAY_VALUE(globalIndex) Get(globalIndex)->SubType;
#endif
然后在代码中使用
GET\u ARRAY\u VALUE
,并通过查找和替换以前的代码,使用
use\u OLD\u SINTAX
检查要使用的定义


但是,在代码中查找和替换可能更简单,根本不需要宏。

对于自定义类型,您可以这样做

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

#define Array MyType{}
然后

Array[GlobalIndexVariable]
将被替换为

MyType{}[GlobalIndexVariable]
哪个会打电话

Get(GlobalIndexVariable)->SubType;

对于自定义类型,您可以执行以下操作

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

#define Array MyType{}
然后

Array[GlobalIndexVariable]
将被替换为

MyType{}[GlobalIndexVariable]
哪个会打电话

Get(GlobalIndexVariable)->SubType;


这不是有效的宏语法。实际上,“Mat C++”。我加了C,因为它基本上是一个C问题。此外,我不认为重载int是最好的方法。@molbdnilo它不应该是一个“宏”,而是一个简单的替换。从技术上讲,我希望编译器运行到右边的精确文本中,而不是计算值。无论这意味着什么,重载
int
都是不可能的。但你可能还有其他选择。最好是提供一个“完整”的最小示例,说明您正在尝试实现的目标,以及所涉及的不同类型的事情。有人可能会给你一个很好的(或者至少是可行的)解决方案。@RefugnicEternium这是一个宏。C预处理器宏是简单的替换,但不是任意文本。它们不是搜索和替换或
sed
的好替代品。“<代码> >定义真1 也是宏。”这不是有效的宏语法。@ Mat C++,实际上。我加了C,因为它基本上是一个C问题。此外,我不认为重载int是最好的方法。@molbdnilo它不应该是一个“宏”,而是一个简单的替换。从技术上讲,我希望编译器运行到右边的精确文本中,而不是计算值。无论这意味着什么,重载
int
都是不可能的。但你可能还有其他选择。最好是提供一个“完整”的最小示例,说明您正在尝试实现的目标,以及所涉及的不同类型的事情。有人可能会给你一个很好的(或者至少是可行的)解决方案。@RefugnicEternium这是一个宏。C预处理器宏是简单的替换,但不是任意文本。它们不是搜索和替换或
sed
的好替代品。(
#define TRUE 1
也是一个宏。)我知道它不是一个宏。它也不应该是,而是一个简单的替代品。因此,当预处理器完成时,它应该运行到右侧的确切文本中。没有变量展开之类的。是的,但是宏预处理器不是这样工作的。它将用[以及之后的所有内容]替换数组。这实际上正是我想要的。为了让它接受表达式并将其转换为右侧的内容。或者等等,您的意思是它将
数组[GlobalIndexVariable]
转换为
[GlobalIndexVariable]
还是什么?@refuggniceternium当前它用
[GlobalIndexVariable]Get(GlobalIndexVariable)替换所有出现的
数组
->SubType;
,我不认为这是你想要的。@DeepBlackDwarf如果我们能去掉第一个
GlobalIndexVariable
,它正是我想要的。我知道它不是一个宏。它也不应该是宏,而是一个简单的替换。因此,当预处理器完成时,它应该运行到精确的文本中在右边,没有变量