2015-09-21 3 views
0

По причинам Устава мне нужно поддерживать структуру старого массива, однако компилятор говорит мне, что есть проблема с моим синтаксисом выражения.#define значение массива с индексом

Вот что у меня есть:

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

Get возвращает действительный указатель на структуру, которая содержит SubType

Теперь я представлял себе это принять любой случай Array[GlobalIndexVariable] и просто преобразовать его в вызов функции , но, видимо, я ошибся.

Я даже не знаю, что искать в этом контексте, поэтому небольшая помощь будет высоко оценена.

спасибо.

Edit: Так был задан вопрос, вот одна из линий, которые бросают ошибку:

LocalVariable = Array[GlobalIndexVariable]; 

Я хотел бы подчеркнуть, что я не ищу, чтобы сделать это в macro, но многое скорее просто захотите заменить Array[GlobalIndexVariable]; на Get(GlobalIndexVariable), поэтому, как только ничего, кроме GlobalIndexVariable, замена не сработает и пропустит другую ошибку.

Edit:

Просто чтобы быть абсолютно уверенным, что я понял:

Сейчас у меня есть 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, можно использовать определения или что-то еще, чтобы получить точно такое же поведение, как и раньше для старого кода?

+0

Это недопустимый синтаксис макроса. – molbdnilo

+0

@Mat C++, фактически. Я добавил C, потому что это в основном проблема C. Кроме того, я не думаю, что перегрузка int - лучшая идея здесь. –

+0

@molbdnilo Это не должно быть «макросом», а скорее простой заменой. Технически я хочу, чтобы компилятор работал в точном тексте, который у меня есть на правой стороне, а не на вычисленном значении. –

ответ

2

С пользовательского типа, вы можете сделать

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

#define Array MyType{} 

И затем

Array[GlobalIndexVariable] 

будет заменен

MyType{}[GlobalIndexVariable] 

который будет называет

Get(GlobalIndexVariable)->SubType; 
+0

Это ... представляется вполне осуществимым. Я собираюсь попробовать это сразу. Немного подробный для моего вкуса, но если я не могу иметь индексный оператор как часть идентификатора, это будет лучше, чем я могу получить. Спасибо, кучка. –

+0

Кажется, что работает. Однако есть одна коррекция, которую мне нужно сделать: это не '#define Array MyType {}', а '#define Array MyType()'. Еще раз спасибо. –

+0

'MyType {}' правильно, так как C++ 11, в вашем, на C++ 03, действительно, используйте 'MyType()'. – Jarod42

1

Ваша проблема в вашем #define

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

The [] не является допустимым синтаксисом макровызовов. Если вы делаете C++, вы можете написать оператор [] для вашего типа массива. Если вы находитесь в C, вы немного привязываетесь. Вероятно, вам придется заменить все круглыми скобками, а не квадратными.

+0

Я знаю, что это не макрос. Это тоже не должно быть, но довольно простая замена. Итак, когда препроцессор сделан, он должен работать с точным текстом с правой стороны. Никакое переменное расширение или подобное. –

+0

Да, но препроцессор макросов не работает. Он заменит Array на [и все после этого. –

+0

Это именно то, что я хочу. Чтобы он принял выражение и преобразовал его в то, что у меня на правой стороне. Или подождите, вы имели в виду, что это сделает 'Array [GlobalIndexVariable]' в '[GlobalIndexVariable]' или что-то еще? –

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 определения которого вы хотите использовать по найти и заменить предыдущий код.

Но, возможно, это может быть проще найти и заменить внутри вашего кода без макроса вообще.

+0

Я искал решение, которое не требовало, чтобы я трогал старый код, если это возможно. Если бы это был вызов функции, чтобы начать с этого, это было бы решением, это точно. –

+1

Если вы меняете структуру, вы должны, очевидно, изменить код там, где это необходимо. И изменение кода является более чистым, чем поиск обходного пути, который использует старый синтаксис с новой структурой, которая влияет на читаемость кода. – Jepessen

+0

Я начинаю опасаться, что вы можете быть правы. –

Смежные вопросы