MyMSDN

MyMSDN记录开发新知道

从error: c2275, c2143看跨编译器C程序

用惯了GCC编译器,也就容易将C语言的写法和其它的写法混淆起来。虽然在GCC平台上可以顺利编译,但是在其它编译器比如Microsoft C++编译器下就有可能编译出错了。看下面这段代码:

#include <stdio.h>
int main(void){
     char *s1 ;
     s1 = "Hello";
     char *s2 ;
     s2 = "World";
     printf("%s %s\n",s1,s2);
     return 0;
}

它看上去是可以执行的,在GCC编译器下它确实也是可以执行的。但在VC++中则不能执行,准确地说,在未开启编译器选项为标准C99的情况下,是会编译出错的。

按如上所示的编译器在C89标准下编译,GCC pass,MS C++ fatal。错误指示会在s2 = "World"; 这句话上,错误代码通常为

error C2143:语法错误:缺少“;”(在“类型”的前面)

要是您的类型刚好由typedef来定义的话,则会出现错误代码:

error C2275:“your_type”:将此类型用作表达式非法

下面两幅截图展示了以上两种错误。因为在变量声明环节出了错误,因此会引发一连串的错误,包括变量未定义等错误。

error C2275

error C2143

建议:为了保持源码能够保持跨编译器特性,我们最好能够按旧时的写法来写(C89)直到它确实被淘汰为止。

posted on 2008-09-16 02:22 volnet 阅读(2595) 评论(8)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 从error: c2275, c2143看跨编译器C程序[未登录] 2008-09-16 13:18 陈梓瀚(vczh)

没看出什么问题来……  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序[未登录] 2008-09-16 13:38 raof01

我也没看出问题。  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2008-09-16 14:26 volnet

被楼上两个鄙视了一番,……瀑布汗……
我这个只是记录一下,自己留着纪念罢了,太久没写代码了,写着写着就忘本了,出了点错,记一下嘛,又不要花钱……  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2010-03-25 18:34 OwnWaterloo

C89中声明必须在block的头部, 然后是语句。
C++中声明也是一个语句, 所以就没有这个区别了。


另外, 问问lz:
>>在未开启编译器选项为标准C99的情况下,是会编译出错的。
msvc怎么开启标准C99? msvc好像是不支持c99的?
  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2010-03-25 20:51 volnet

很久很久以前VC的默认配置是
变量声明一定要统统放在变量定义之上  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2010-03-25 21:07 OwnWaterloo

@volnet
现在不也这样么? 如果是按C语法编译的话。
有办法按C99语法编译么?
  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2010-03-25 22:36 volnet

@OwnWaterloo
似乎没有  回复  更多评论   

# re: 从error: c2275, c2143看跨编译器C程序 2012-06-05 16:11 UU大师

还是有用的,这段时间总遇到这个问题,纠结  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


特殊功能