こんばんは。少々整理してみようと思います。
manaさんの環境はBorland c++とのことですから、
C言語でも、C++でもコンパイルが可能です。
まず、ソースの拡張子を.cにした場合、
switch(i){
case 1: char *p="abc";
func(p);
break;
case 2: char *pp="def";
func(pp);
break;
case 3: char *ppp="hij";
func(ppp);
break;
}
では、変数の宣言場所が正しくないのでエラーになります。
C言語では、関数のブロックも含め、ブロック内では変数の宣言は
実行文よりも先でなければいけないからです。
ですから、{}で囲んで新たなブロックを作れば、新たな変数を宣言
することができます。この場合、変数の有効範囲はブロック内と
なります。つまり、
switch(i){
case 1:{
char *p="abc";
func(p);
}
break;
case 2:{
char *pp="def";
func(pp);
}
break;
case 3:{
char *ppp="hij";
func(ppp);
}
break;
}
は正しくコンパイルされます。
一方、拡張子を.cppとした場合は、
switch(i){
case 1: char *p;
p="abc";
func(p);
break;
case 2: char *pp;
pp="def";
func(pp);
break;
case 3: char *ppp;
ppp="hij";
func(ppp);
break;
}
はコンパイルすることができます。これは、C++では任意の箇所で
宣言を書くことができるからです。しかし、C++でも、
switch(i){
case 1: char *p="abc";
func(p);
break;
case 2: char *pp="def";
func(pp);
break;
case 3: char *ppp="hij";
func(ppp);
break;
}
caseの中で変数の宣言と初期化を行うことはできません。
(caseの中以外では宣言と初期化は任意の場所で行うことができます。)
これは、自動変数の初期化はプログラムの処理が走って始めて行われる
ものなので、case中で行うと、初期化が条件によって行われたり、行われ
なかったりするので、支障があると言うことなのだと思います。
ただし、この場合でも新たなブロックを作れば、初期化は可能になります。
switch(i){
case 1:{
char *p="abc";
func(p);
}
break;
case 2:{
char *pp="def";
func(pp);
}
break;
case 3:{
char *ppp="hij";
func(ppp);
}
break;
}
ブロック内で宣言された変数は、ブロック内でのみ有効なので、
ブロックを越えて使用されることがないからです。
さて、manaさんの例ですが、変数を*p、*ppp、*pppppと分けずに、
*pのみにし、最初に宣言、case中では代入のみでいいと思いますが、
いかがでしょう。
char *p;
:
switch(i){
case 1:
printf("東京特許許可局:toukyoutokkyokyokakyoku\n");
p="toukyoutokkyokyokakyoku";
nyuryoku(p);
break;
case 2:
printf("生麦生米生卵:namamuginamagomenamatamago\n");
p="namamuginamagomenamatamago";
nyuryoku(p);
break;
case 3:
printf"隣の客はよく柿食う客だ:tonarinokyakuhayokukakikuukyakuda\n");
p="tonarinokyakuhayokukakikuukyakuda";
nyuryoku(p);
break;
:
|