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文がないのは何故でしょうか?
初心者なので質問自体が変だったらスミマセン。
No.2ベストアンサー
- 回答日時:
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にするのが正しいのかは仕様書やソースコードから判断してください。
No.3
- 回答日時:
これ, 実際のプログラムでしょうか. もしそうなら Q2 は「ただ単に書き忘れただけ」でしょう.
void がない時代とかそ~いうソースならそもそも char など書かないでしょうし, void を知らない人間が書いた場合もほぼ同様だと思う....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
一定時間ごとにプログラムを起...
-
既定のコンストラクタがありま...
-
多重定義が起きている?--lnk20...
-
コンパイルエラー: LNK2001
-
カノニカルモードの設定について
-
マルチメディアタイマーの使用方法
-
4桁7セグでダイナミック点灯
-
ArduinoでMouse関数を使用して...
-
コールバックって・・・
-
C#でテンキーの操作は可能でし...
-
C# KeyDownイベントでショート...
-
DirectInput でのエラー
-
VC++でGetKeyboardStateがうま...
-
Notepad++の関数リスト表示の変...
-
typedef unsigned int UINT;が...
-
[Visual C++ 6.0] コンパイル(...
-
関数の戻り値がextern
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
ArduinoでMouse関数を使用して...
-
(void)0 はどんな意味ですか
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報