使用#define后出现C语法错误

时间:2013-02-28 14:31:55

标签: c

我正在使用Microsoft Visual Studio 2010编写C代码。这是我定义的代码片段:

#define setImagVal_Matrix(matrix,type,x,y,val) \
(getImagVal_Matrix(matrix,type,x,y) = (val))

然后我在这个函数中使用它:

for(bands=0; bands < no_of_bands; bands++) {
outputmatrix[bands] =  new_Matrix(yrange,xrange,getDataType_Image(inputImage),getDataFormat_Image(inputImage));
    for(r=0; r < no_of_rows; r++) {
        for(c=0; c < no_of_cols; c++) {
            if(c<x1 || c>x2 || r<y1 || r>y2)
            {
                continue;
            }
            else
            {
                  setImagVal_Matrix(outputmatrix[bands],getDataType_Matrix(outputmatrix[bands]),c-x1,r-y1,123);
            }
        }
    }
}

但是,它在setImagVal_Matrix函数调用中显示了这个错误:
     “错误:预期表达式”

当我构建解决方案时,输出显示同一行的语法错误:
     1&gt; c:\ cviplab-net-2010 \ cviplab \ crop.c(50):错误C2059:语法错误:')'

花了几个小时后,我仍然找不到错误的原因。知道怎么解决吗?

编辑:
我分析了预处理文件,发现语法错误,但我仍然不知道如何解决它。这是出错的行:
  ((((((outputmatrix[bands])->data_type) **)((outputmatrix[bands])->iptr))[r-y1][c-x1]) = (123));
该错误适用于)

之后的**

3 个答案:

答案 0 :(得分:2)

停止使用宏作为函数。试试这个:

inline void setImagVal_Matrix(int matrix, int type, int x, int y, int val) {
    getImagVal_Matrix(matrix, type, x, y) = val;
}

根据需要更改int类型,您将获得编译器帮助您处理有用的错误消息而不是隐藏消息。哎呀,它甚至可以帮助你找出论证类型。

答案 1 :(得分:0)

在您的宏中,您可以分配一些看起来不像左值的东西。你的意思是==

答案 2 :(得分:0)

我想建议至少使用括号作为宏参数:

#define setImagVal_Matrix((matrix),(type),(x),(y),(val)) \
       (getImagVal_Matrix((matrix),(type),(x),(y)) = (val))

另外,要查看它是否真的是支架问题,您可以尝试查看预处理文件。

但是,实际上为此目的使用宏并不是一个好习惯。如果你关心函数调用,你可以创建函数inline

inline void setImagVal_Matrix(matrix,type,x,y,val) {
    getImagVal_Matrix(matrix,type,x,y) = val;
}

尽管inline 仅建议编译器,但这样可以避免大量编译错误,并且几乎不会调试运行时错误。