c - 将可变长度数组声明为宏

标签 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);    
}

这会违背编码风格还是会受到宏问题的困扰?

我知道你需要小心变量名!

最佳答案

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

#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];
}

但是这样做很奇怪:

  • as __J__ 我认为这无助于使程序可读
  • 源代码中的其他位置size_of_local_char_array可以使用,但如果您/某人搜索其定义,它将找不到
  • 宏生成两条语句,当然在这种情况下不可能将它们分组在一个 block 中{},这是危险的,因为这不直观。正如您在代码中看到的,您添加了一个无用的“;”使用宏后,最后一个“;”已经存在于宏定义中

关于c - 将可变长度数组声明为宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54389543/

相关文章:

c - 具有 1 个线程的 OpenMP 比顺序版本慢

c - 如何使用 iso_c_binding 将 MPI 通信器句柄从 Fortran 传递到 C

ruby-on-rails - rails text_field 创建数组数组

c - C 宏的作用域规则

macros - clojure 中的宏是如何扩展的?

C++ std::string InputIterator 代码到 C 代码

c++ - 我们还应该优化 "in the small"吗?

macros - 在交换中调用带有字符串的 Clojure 函数?

python - 如何阻止它返回 "\n"以及列表中的数据?

c - 用字符串的一部分填充二维数组