我正在使用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));
该错误适用于)
**
答案 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
仅建议编译器,但这样可以避免大量编译错误,并且几乎不会调试运行时错误。