使用C中的宏初始化未知大小的2D数组

时间:2015-01-05 17:24:07

标签: c arrays multidimensional-array c-preprocessor

我正在开发一个小型宏项目,要求我将二维数组文字传递给我的一个宏,如:myMacro({{0, 1, 2}, {2, 1, 0}})。有没有必要将数组文字的大小传递给宏,有没有办法让它扩展到以下:int[2][3] = { {0, 1, 2}, {2, 1, 0} }或等效的东西(任何保留数组形状的初始化都可以)?在此先感谢您的任何帮助

2 个答案:

答案 0 :(得分:4)

#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define VA(...) __VA_ARGS__
#define TRANS(r, data, elem) { VA elem},

#define myMacro(name, arg)\
    int name[BOOST_PP_TUPLE_SIZE(arg)][BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(0,arg))] = \
    { BOOST_PP_SEQ_FOR_EACH(TRANS, , BOOST_PP_VARIADIC_TO_SEQ arg)}

int main(){
    myMacro(a, ((1,2,3),(4,5,6)) );//=>int a[2][3] = { { 1,2,3}, { 4,5,6}, };
    return 0;
}

答案 1 :(得分:2)

如果你有第二个维度的上限,那么你可以使用哨兵值,如:

#include <stdio.h>

#define MAXCOLUMNS 20
#define VALUE {{0,1,2,-1},{2,3,4,-1},{0,0,0,0,1,-1},{-1}}

int main()
{
  int v[][MAXCOLUMNS] = VALUE;
  int x, y;

  for (y = 0; v[y][0] != -1; y++)
    for (x = 0; v[y][x] != -1; x++)
      printf("[%d,%d] = %d\n", x, y, v[y][x]);

  return 0;
}

这将在不事先知道确切尺寸的情况下打印出值。这是你想要达到的目标吗?

编辑:@ BLUEPIXYs解决方案并不需要知道或猜测最大尺寸,另一方面,这适用于较旧的C版本(不过是一个大问题)。