現在、C言語の勉強中です。
プロトタイプ宣言は関数内で宣言をすることは可能でしょうか。
その際、宣言が有効なのはその関数内ということになりますか?
OS:windows7
VS2010 express
で次のプログラムを記述してもコンパイルエラーにはなりませんでした。
もし、プロトタイプ宣言もスコープを持つとしたら、関数plus()の中でminus()
を呼び出したところでwarningかエラーをはくと考えましたが、出ませんでした。
どなたか、教えてください。
#include <stdio.h>
int main(void){
char* plus(void);//プロトタイプ宣言
char* minus(void);//
char *ans;
ans = plus();
printf("mainFunc = %s", ans);
ans = minus();
printf("mainFunc = %s", ans);
}
char* plus(){
char *answer;//関数の戻り値はポインタ
answer = minus();//プロトタイプ宣言なしで関数を使用
printf("plusFunc = %s",answer);
return "plus success\n";
}
char* minus(){
return "minus success\n";
}
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
>LinuxやUnixの環境でテストしなくては
>ダメということですね。
どういう事でしょう?
もしかしてコンパイル時に警告やエラーが起きないことで、自分のコーディングが正しいかの判定をしようとしてますか?
もしそうなのでしたらコンパイル時にエラーや警告もなく、実際に実行して意図した動作をしたとしても、コーディングは間違っている場合もありますのでお気を付けください。
よくあるのはNULLと0の混同。
No.4
- 回答日時:
まったく違う話になります。
私はこれを見たとき、関数ポインタに見えてしまって。
一緒に勉強してもらえたらと思って、回答してみました。
char hoge() {
return ('A');
}
main () {
char *abc();
abc=hoge;
abc();
// この場合、abcは関数のプロトタイプではなく、char (*abc)();というポインターそのもの。
}
多分この書式のせいで、コンパイラーによって、問題が出るのかもしれません。。
正式なプロトタイプは
char* plus(void);//プロトタイプ宣言
なら、
typedef char * (FUNC)(void);
ということで、これらが問題を起こしているのかも、と
私はちょっと、推測してしまいました。
勉強になりました。
ありがとうございました。
関数のポインタ宣言は私のコンパイラでは
char *abc() //エラー
char (*abc)() //OK
でした。こちらも環境依存かも?
あわてて、勉強したので返信がおそくなってしまいました。
No.3
- 回答日時:
あ~, たぶんわかった.
C において 1つのプログラムに「同じ外部名を持つ実体」は 1つしか存在できない. だから, 当該プロトタイプの「本来のスコープ」から外れても「その外部名である以上それだ」と判断できるってことじゃないかな. ちなみに gcc だと (こっちは逆にスコープを「正しく」判断した結果として) エラーになりますね.
そして main と plus を入れ替えると VC はアホなエラーメッセージを出しやがる.
#2 の話は, おそらく単純なバグ.
ありがとうございました。
Cのスコープって実際にはコンパイラによって違うんですね。
っていうか。。。結構、いいかげんなものなのでしょうか?
No.2
- 回答日時:
main関数を少し変えて、
#include <stdio.h>
int main(void){
char* plus(void);//プロトタイプ宣言
int minus;
{
char* minus(void);//
char *ans;
ans = plus();
printf("mainFunc = %s", ans);
ans = minus();
printf("mainFunc = %s", ans);
}
minus=-1;
}
これでも、文法違反はないはずですが、Visual StudioのCコンパイラではエラーになります。
同じVisual StudioのC++コンパイラを使うとエラーにはなりません。Cコンパイラのバグかもしれません。
ありがとうございました。
cygwinのgccでいただいたsampleのコードをコンパイルしました。
おっしゃる通りエラーはなく実行できました。
こちらはVSのcコンパイラのバグだと理解しました。
mainの中のブロック内で宣言したプロトタイプのスコープは
予想通りでしたが、なぜmain直下に記述したプロトタイプは
main外の関数で有効になるのでしょうか?
しつこくて、すみません。
#include <stdio.h>
int main(void){
char* plus(void);//プロトタイプ宣言
//char* minus(void); //ここで宣言した場合はmainの外でも有効?
int minus;
{
char* minus(void);//ここで宣言したので、当然、plus()では無効
char *ans;
ans = plus();
printf("mainFunc = %s", ans);
ans = minus();
printf("mainFunc = %s", ans);
}
minus=-1;
}
char *plus(){
char *minus(void);//再度、プロトタイプ宣言
char *ans;
ans = minus();
printf("%s", ans);
return "plus\n";
}
char *minus(){
return "minus\n";
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
バイトスワップをやりたい
-
c言語でユーザ関数を利用して入...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
Linuxでフォルダ内全ファイル名...
-
enumの記述について。
-
配列をnビットシフトする
-
ユニコード文字列の分割
-
DPマッチング
-
C言語です
-
RGB→YUV変換のプログラム
-
C言語のビットフィールドについて
-
c++ 文字列を入力して、一文字...
-
C言語のポインターで詰まっている
-
ワイルドカードを用いた文字列検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報