注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识31--C和C++中全局变量的声明和初始化小问题  

2012-06-18 20:08:29|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++小知识31--C和C++中全局变量的声明和初始化小问题
这个竟然空了一节,在这里补上吧,今天有一个小问题才发现,在C 和C++中,全局变量的声明和初始化的过程中,出现了一些问题,如下:

int a = 10;
int *t;
int *p = &a;
t = &a;
t = p;

int main()
{
  return 0;
}

 很简单的代码,没什么,但编译后报:
1>d:\vcworkspace\testp\testp\testp.cpp(6) : error C2440: 'initializing' : cannot convert from 'char *__w64 ' to 'int *'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>d:\vcworkspace\testp\testp\testp.cpp(15) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\vcworkspace\testp\testp\testp.cpp(15) : error C2040: 't' : 'int' differs in levels of indirection from 'char *'
1>d:\vcworkspace\testp\testp\testp.cpp(15) : error C2440: 'initializing' : cannot convert from 'char *' to 'int'
纠结了,后来考虑了一下,在C编码中,如果你给一个变量定义,他会认定是一个int型,这个函数如果没有声明返回值,他会自动认定为int是一个道理,也就是前面说的,如果是int、char型在C里都好

做了。而在C++中,你可以看到编译器在说,重复定义或者不能强制转。
用老版的VC6,报错误说初始得是一个常量,用GCC编译,也基本是要求常量的错误。
仔细考虑了下:
1、声明后再初始化(而不是声明时一起初始化),编译无法识别这个变量是新建还是默认,在C语言中有默认这一说,而C++没有。所以有时候儿就报,无法将annot convert from 'char *' to 'int'
2、初始必须是一个右值,也就是说,编译器必须认识是多少,所以常见的是int a = 10;10就是一个右值。
3、如果将错误的代码弄到函数里就可以了,原因就是函数运行时,这些值都已经固定了,或者说,C语言是函数组成的,而不是由语句组成的。

  评论这张
 
阅读(680)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017