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

使用C中的宏初始化未知大小的2D数组,c,arrays,multidimensional-array,c-preprocessor,C,Arrays,Multidimensional Array,C Preprocessor,我在做一个小的宏项目,它要求我将一个二维数组文本传递给我的一个宏,如下所示:myMacro({0,1,2},{2,1,0})。在不必将数组文字的大小传递给宏的情况下,是否有方法将其扩展为以下内容:int[2][3]={{0,1,2},{2,1,0}或其他等效内容(保留数组形状的任何初始化都可以工作)?提前感谢您的帮助如果您有第二维度的上限,则可以使用sentinel值,例如: #include <stdio.h> #define MAXCOLUMNS 20 #define VALU

我在做一个小的宏项目,它要求我将一个二维数组文本传递给我的一个宏,如下所示:
myMacro({0,1,2},{2,1,0})
。在不必将数组文字的大小传递给宏的情况下,是否有方法将其扩展为以下内容:
int[2][3]={{0,1,2},{2,1,0}
或其他等效内容(保留数组形状的任何初始化都可以工作)?提前感谢您的帮助

如果您有第二维度的上限,则可以使用sentinel值,例如:

#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;
}
#包括
#定义MAX20列
#定义值{0,1,2,-1},{2,3,4,-1},{0,0,0,1,-1},{-1}
int main()
{
int v[][MAXCOLUMNS]=值;
int x,y;
对于(y=0;v[y][0]!=-1;y++)
对于(x=0;v[y][x]!=-1;x++)
printf(“[%d,%d]=%d\n”,x,y,v[y][x]);
返回0;
}
这将在事先不知道确切尺寸的情况下打印出值。这是你想要达到的目标吗

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

#包括
#包括
#包括
#包括
#定义VA(…)\uU VA\u参数__
#定义TRANS(r,data,elem){VA elem},
#定义myMacro(名称,参数)\
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));//=>inta[2][3]={{1,2,3},{4,5,6},};
返回0;
}

是二维尺寸还是任意尺寸?另外,第二个索引(列数)是否有上限?它始终是2d,但可以是任意宽度/长度。例如,它也可以被称为
myMacro{{1,2,3,4},{5,6,7,8})
。没有上限,但每行的列数总是相同的。也许可以尝试一个可变宏?@n.m.我目前使用的是可变宏,但我需要能够将
\uu VA\u ARGS\uuu>绑定到一个变量以供以后使用。哦,这是C。我知道的唯一方法是窃取Boost::预处理器库。Boost是一个C++库,但是预处理器部分应该为C工作,而不需要修改。一个上限值可以工作,但只适用于第一个元素。代码应该能够猜测有多少不同的行(一个对应于由另一个宏创建的枚举的每个元素,我可以在末尾添加一个
enum\u SIZE
值来计算行数,但单个列的长度未知。我使用的解决方案是猜测它可能会有多大。我正在尝试使用:
定义VA\u NUM\u参数(_1,_2,_3,_4,N…)N
但这只适用于63,并且根据传递的数字也可能是错误的,所以我无法使用它。哦,对不起,我直到现在才看到这个答案。这在C(最好是99年以前)中有效吗Boost的预处理器是NerdicViking的一部分,C的决定不能与C99以前的C++一起工作,但是它被证实是用VC2010工作的。@ BLUBYXY CULL,我不知道Boost有那些宏。我用GCC检查过了,C99级是需要的(在预处理器之前会失败)。@SanteriPaavolainen是的,可变宏似乎来自C99。
#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;
}