(原創) c/c++独特的block scope (C/C++)

C/C++的Scope共有6种:global、class、namespace、local、block、statement (C++ Primer 4th P.75) 。其中比较特别的是block scope,只要在curly brace {} 之间,就自成一个scope。

 1 None.gif #include  < iostream >
 2 None.gif
 3 None.gif using   namespace  std;
 4 None.gif
 5 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
 6InBlock.gif
 7InBlock.gif  int i(1);
 8InBlock.gif  cout << i << endl;
 9InBlock.gif
10ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
11InBlock.gif    int i(2);
12InBlock.gif    cout << i << endl;
13ExpandedSubBlockEnd.gif  }

14InBlock.gif
15InBlock.gif  cout << i << endl;
16InBlock.gif
17InBlock.gif  return 0;
18ExpandedBlockEnd.gif}

以上的程序在Visual C++ 2005,Turbo C 2.0, Turbo C++ 3.0都可过,执行结果为1 2 1(当然cout要改成prinf()),可见block scope是古早C就有的机制。

但相同的程序代码,若改成C#或Java,连compile都不能过。
C#
 1 None.gif using  System;
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif class  HelloWorld  dot.gif {
 4ExpandedSubBlockStart.gifContractedSubBlock.gif  static void Main(string[] args) dot.gif{
 5InBlock.gif    int i = 1;
 6InBlock.gif    Console.WriteLine(i);
 7InBlock.gif
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif      int i = 2;
10InBlock.gif      Console.WriteLine(i);
11ExpandedSubBlockEnd.gif    }

12InBlock.gif
13InBlock.gif    Console.WriteLine(i);
14ExpandedSubBlockEnd.gif  }

15ExpandedBlockEnd.gif}

16 None.gif

C# compile会出现以下错误讯息

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else 

Java

 1 ExpandedBlockStart.gif ContractedBlock.gif public   class  HelloWorld  dot.gif {
 2InBlock.gif    
 3ExpandedSubBlockStart.gifContractedSubBlock.gif  public static void main(String[] args) dot.gif{
 4InBlock.gif    int i = 1;
 5InBlock.gif    System.out.println(i);
 6InBlock.gif        
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 8InBlock.gif      int i = 2;
 9InBlock.gif      System.out.println(i);
10ExpandedSubBlockEnd.gif    }

11InBlock.gif        
12InBlock.gif    System.out.println(i);
13ExpandedSubBlockEnd.gif  }
    
14ExpandedBlockEnd.gif}

15 None.gif

Java compile会出现以下错误讯息
Duplicate local variable i

 很显然C#和Java都没有block scope的概念。

block scope有什么用呢?

举例来说,本来在程序中只连上SQL Server,故将此Connection命名为con,但后来修改程序,还要连上Oracle,因为con变量已经用过了,可能得另取con1为变量名,或取conOracle,但这样的命名规则就和之前的程序不同,造成整个程序风格不一,若有block scope,则不用在对变数命名有任何困扰,SQL Server区段,用{}包起来,使用con为变量名称,Oracle区段,也用{}包起来,继续使用con为变量名称,因为彼此不相干扰,所以可以用相同的变量名称。

或许有人会说,这样的程序风格,以后不好debug吧,假如在{}外也宣告con,这样类似global variable和local variable相同,的确难以debug,但若con都写在{}内,则都是local variable,且step by step debug时,local window只要出了{},该变数就会不见,类似function中又有小function,我记得在Pascal语言中,就有Procedure内中又有Procedure的写法,所以应该不难debug,不过,既然C#和Java这两个modern language都不支持block scope,或许这种写法真的不好维护,且我在其它C/C++的书上,也没看过这种写法。我会用这种写法一段时间实验看看,看是否真的不好维护,有任何心得我会继续报告。


Reference 
C++ Primer 4th P.54 ~ P.55 P.75 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值