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
,它正是我想要的。我知道它不是一个宏。它也不应该是宏,而是一个简单的替换。因此,当预处理器完成时,它应该运行到精确的文本中在右边,没有变量