объявление массива переменной длины как макроса - PullRequest
0 голосов
/ 27 января 2019

Может ли это сделать:

#define VARIABLE_LENGTH_CHAR_ARRAY(name, size) \
                            int temp_array_size_macro_index = size; \
                            char "#name"[temp_array_size_macro_index];

и при основном использовании это будет выглядеть так:

main(){
    VARIABLE_LENGTH_CHAR_ARRAY(local_char_array, 16);    
}

будет ли это противоречить стилям кодирования или будет связано с проблемами макроса?

Я знаю, что вы должны быть осторожны с именем переменной!

1 Ответ

0 голосов
/ 27 января 2019

если я прав, вы хотите что-то подобное:

#define VARIABLE_LENGTH_CHAR_ARRAY(name, size) \
                        const int size_of_##name = size; \
                        char name[size_of_##name]

int main()
{
   VARIABLE_LENGTH_CHAR_ARRAY(local_char_array, 16);
}

Имя переменной (теперь const ) для размера теперь зависит от имени самого массива,которые минимизируют вероятность иметь омонимы

Расширение этого кода, производимого gcc -E, дает:

int main()
{
   const int size_of_local_char_array = 16; char local_char_array[size_of_local_char_array];
}

Но сделать это странно :

  • как __J__ I думаю, что это не помогает сделать программу читабельной
  • в другом месте, где в вашем источнике может использоваться size_of_local_char_array, но если вы / кто-то ищете его определение, оно не будетfound
  • макрос создает два оператора, и, конечно, в этом случае невозможно сгруппировать их в блок {}, это опасно, поскольку это не интуитивно понятно.Как вы можете видеть в своем коде, вы добавили бесполезный ';'после использования макроса во время финального ';'уже присутствует в определении макроса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...