電子書籍の厳選無料作品が豊富!

C言語を、他人のプログラム例を見ながら勉強を始めた者です。

----- abc.h -----
extern char aaa(); (1)
extern char bbb(); (2)

----- abc.c -----
char aaa()
{
char sw;
(3)
}

char bbb()
{
char sw;
return sw; (4)
}
Q1.
(1)(2)は戻り値が外部変数ということでよいのでしょうか?
YESとすれば(4)で自動変数のswが戻り値になっているのは何故でしょうか?
Q2.
(3)のbbb()では戻り値がvoidではないのに
return文がないのは何故でしょうか?
初心者なので質問自体が変だったらスミマセン。

A 回答 (3件)

A.1 違います。


「『char aaa()』という関数が外部で定義されている」という意味です。

例えば、
bbb.c
----
#include "abc.h"

void ccc(){
aaa();
}
----
として、 cc abc.c bbb.c などとコンパイルすれば、 abc.cで定義された関数をbbb.cで使うことができます。
この仕組みは、知らないうちに普段から使っています。
例えば、printfですが、正確にはC言語でなく、「標準ライブラリ」という、既のコンパイル済みのプログラムを利用しているものです。printfが使えることを知らせるために、stdio.h の中には extern printf( .. というような記述があります(実際には、そこからさらに#includeされたファイルに記述されていたり、前後に他の記述が付いていることもありますが)
詳細は「分割コンパイル」で検索するとよいでしょう。

A.2
・単なる間違い
・void型の無い処理系、なかったころの古いソースコード
・もとの作者がvoid型を知らない

あたりが考えられます。
エラーではありませんし、void関数として利用してもとりあえずは動作します。
が、最近の一般的なコンパイラでは警告が出るはずです。
なにかを返すのが正しいのか、voidにするのが正しいのかは仕様書やソースコードから判断してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/05/15 10:00

これ, 実際のプログラムでしょうか. もしそうなら Q2 は「ただ単に書き忘れただけ」でしょう.



void がない時代とかそ~いうソースならそもそも char など書かないでしょうし, void を知らない人間が書いた場合もほぼ同様だと思う....
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/05/15 10:00

>Q1.


>(1)(2)は戻り値が外部変数ということでよいのでしょうか?
>YESとすれば(4)で自動変数のswが戻り値になっているのは何故でしょうか?

関数が外部参照と言う意味です。
なので(4)は説明できますね。
まぁ値を入れずに戻しても意味無いですけどね。

>Q2.
>(3)のbbb()では戻り値がvoidではないのに
>return文がないのは何故でしょうか?

return文がないのはマズイです。普通は警告が出るはずですが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/05/15 10:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!