将可变长度数组声明为宏

时间:2019-01-27 15:05:34

标签: c arrays macros

可以这样做:

#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 :(得分:1)

如果我是对的,你想要这样的东西:

#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中可以使用的其他位置,但是如果您/某人搜索了它的定义,则找不到
  • 该宏产生两个语句,当然在这种情况下,不可能将它们分组在一个块{}中,这很危险,因为这不直观。如您在代码中所见,您添加了一个无用的';'使用宏后,最后一个';'宏定义中已经存在