当前位置:C++技术网 > 资讯 > VS2010编译libuv错误C2275(将此类型用作表达式非法)分析和解决方法

VS2010编译libuv错误C2275(将此类型用作表达式非法)分析和解决方法

更新时间:2016-04-01 16:25:48浏览次数:1+次

    在编译VS2010版的linuv时,发现提示编译错误C2275,错误如下:
1>src\win\fs-event.c(73): error C2275: “size_t”: 将此类型用作表达式非法
1>          c:\program files\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h(29) : 参见“size_t”的声明
1>src\win\fs-event.c(73): error C2146: 语法错误: 缺少“;”(在标识符“filenamelen”的前面)
1>src\win\fs-event.c(73): error C2065: “filenamelen”: 未声明的标识符

    而仔细查看libuv源码,也没有错误。然后看到代码文件是.c后缀,编译时使用的是C编译器,而不是C++编译器。
    那么也就是说,C的语法和C++的语法之间的一些差异就体现出来了。C编译器要求变量的声明需要放在作用域的开头,这里是函数的开始处。而C++编译器不要求,在哪用就在哪声明,也可以在开头声明好。所以,写C++代码是就比较放得开,什么时候需要什么时候声明就可以了。而libuv是用C语言写的,代码后缀为.c,而在VS中用的是C编译器编译的,所以就出现这种问题。
    在出错的代码的代码附近是这样的:
size_t dirlen = wcslen(dir);
if (dirlen > 0 && dir[dirlen - 1] == '\\')dirlen--;
size_t filenamelen = wcslen(filename);
size_t relpathlen = filenamelen - dirlen - 1;

    错误提示针对的是filenamelen和relpathlen这就表明错误与size_t无关。你看这个代码,真的是找不到问题。

    这个问题只是冰山一角,因为C语言和C++语言不止这一处差异,所以,如果出现编译问题,记得对比C语言和C++语言的语法规范差异,就可以找到问题的所在了。

    GCC编译器或者VS2015编译器都能够编译通过,说明他们都已经支持这些语言特性了。而较低版本的编译器对这些地方还是斤斤计较。

    知道了问题所在,那么解决办法就好说了。我们只要按照C编译器的规定写代码即可。我们将代码调整成下面这样就可以了:


size_t dirlen = wcslen(dir); 
size_t filenamelen; 
size_t relpathlen;
if (dirlen > 0 && dir[dirlen - 1] == '\\')dirlen--;
filenamelen = wcslen(filename);
relpathlen = filenamelen - dirlen - 1;
     然后再编译,顺利通过。有图有真相:


VS2010顺利编译libuv

【VS2010顺利编译libuv】