c++的全局变量和size_type

全局变量的使用

不使用任何修饰符:

这样的情况就是定义全局的变量,注意,是定义,这意味着,其他地方不能再出现声明式或者定义式了。所以,如果你是在头文件使用这种方式,那么这个头文件只能被一个cpp文件包含,否则多个cpp文件包含它,就会在链接时报符号重定义错误,因为每个cpp都自己给自己的obj中定义了这个符号。这时,就要考虑使用extern方式了。

使用extern方式:

1.      使用extern int a = 4;这种方式,这种是声明并新定义一个可以被外部obj使用的变量。这种方式由于包含定义,所以,也不能在多个cpp文件包含它(不该在头文件使用,然后多个cpp包含这个头文件),否则,链接时期,会发现之前已经有其他包含这个头文件的cpp的obj文件定义过这个符号了,会报符号已经存在的重定义错误。

2.      使用extern int a;这种方式。如果我们自己没有定义,而只是声明一下,那么要确保其他obj或者库文件中已经包含着这个符号了(比如静态链接库)。如果我们知道这个a是自己准备使用和定义的新的全局变量,应该只在某一个cpp文件定义该变量,并在其他cpp使用extern int a声明来使用这个变量。确保全局只有一个变量定义过程。

Static声明(不能与extern同时使用):

Static表示这是个局部使用的全局变量,也就是说,只能在一个obj中互通修改的符号。如果我们在一个头文件中使用了,而在多个不同的cpp文件包含它,那么每个cpp对应的obj将有一个自己的局部定义符号,链接时将链接各自的符号,这样生成的程序,实际上没有达到共享的效果,这时其实可执行程序有多个全局的静态变量,之前的cpp的程序在可执行程序中的反映也是各自访问各自定义的那个符号。即便我们在cpp中,不好含static的变量声明,而是希望通过extern声明来使用现成的符号,也会在链接时报错,说找不到这个变量符号,大概是静态变量编译后的obj文件似乎是有特殊的符号命名或者符号属性约束,导致按照extern的规则去找回找不到这个变量

另外:看到有文章说单独的const的全局变量,跟static的方式一样,这个试了,不然,static的变量,即便使用extern声明来表示自己只是想借用现成的而非定义一个独立的变量,static也是无法被外部访问的,链接时会找不到符号,而const是可以正常使用的,只要跟其他普通变量一样使用extern声明就好了。

关于size_type,size_t,通常都是无符号的,而且千万不要跟int混用,也不要跟unsigned int混用。首先,size_type类型大小有可能大于int类型大小,其次,跟有符号的int类型混用是多么可怕啊比如:

for(size_type s = array.size() - 1; s >= 0; --s)

        array[s] = s;

这不就是死循环了吗?因为s根本最小只是0而已,非把无符号当有符号用,谁拿你也没办法,也不要以为去看了vc的这个定义是定义为无符号int的,就直接使用unsigned int混用,说不定下一个版本的vc就改变了定义呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值