C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 定義されていない関数のリンク


(過去ログ 131 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■77376 / inTopicNo.1)  定義されていない関数のリンク
  
□投稿者/ aga (1回)-(2015/10/15(Thu) 13:57:58)

分類:[C/C++] 

こんにちは。
C言語のリンクについて質問させてください。

使用言語:C
開発環境:Visual Studio 2012

Soucrce1.c
int main(int argc, _TCHAR* argv[])
{
    Method1();

    return 0;
}

Source2.c
void Method1()
{
    /* 処理 */

    return;
}

上のようなソースをビルドしたとき、
「関数 'Method1' は定義されていません。int 型の値を返す外部関数と見なします。」
といった警告は出るものの、ビルド自体は成功し、実行できます。

Sourece1.cにてMethod1の宣言をしていないので、警告が出ている理由はわかります。
しかし、リンクおよび実行できる理由がわかりません。

警告を見る限りではint型の関数とみなされているにもかかわらず、実際はvoid型として機能できている点も疑問に思います。

どなたかご教授をお願いします。

引用返信 編集キー/
■77378 / inTopicNo.2)  Re[1]: 定義されていない関数のリンク
□投稿者/ 774RR (323回)-(2015/10/15(Thu) 14:14:54)
もともと C ってとても古くからある言語で、最近のコンパイラも昔のソースコードをそのまま使えるよう
後方互換性重視で実装されているものがほとんどだ。

C では、関数 int func(int, int); も void func(void); も、最終的な機械語では _func という名前になる
(関数名の先頭にアンダースコア1個を追加する)
ような実装になっている(ものがほとんど:いまさら変えられない)。
# C++ は別。

なので機械語レベルでは int func(int, int) も void func(void) も区別つかなくて、
「リンクできてしまう」(呼び出した結果は正しくない)のが、まあ普通。

関数原型宣言が無いとき int func() /* 引数個数不定 */ とみなされるのは言語仕様で決まっている。
これが実際には void func() /* この書き方は古いので非推奨 */ であるとき
- 要求された機械語上での名前は同じだからリンクはできる。
- 呼び出し側は返却値があるつもりでいるが、呼ばれた側は返却値を返却していないので、実行すると誤動作する
だけのこと。

int x=func(); としたら x に何が格納されるか不明、つまり誤動作ってことだ。
引用返信 編集キー/
■77379 / inTopicNo.3)  Re[2]: 定義されていない関数のリンク
□投稿者/ aga (3回)-(2015/10/15(Thu) 14:27:01)
No77378 (774RR さん) に返信

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

言語の仕様なのですね…開発環境によるものなのかと、完全に勘違いしていました。

誤動作を防ぐためにも、あらかじめ宣言しておくことが必要ですね。ありがとうございました。
解決済み
引用返信 編集キー/
■77381 / inTopicNo.4)  Re[3]: 定義されていない関数のリンク
□投稿者/ 774RR (324回)-(2015/10/15(Thu) 15:20:27)
関数原型宣言なしのときどう解釈されるかは言語仕様。
リンクできてしまう、というのは歴史的事情って奴だと思う。

C においても、関数原型宣言が間違っているとリンクすらできない処理系ってのは実在する。
そういう意味で「リンクできてしまう」のは言語仕様ぢゃないよ。
太古の昔の処理系がそういう実装をしてしまったので、いまさら変えられないってだけ。

きっちり関数宣言を行ってから呼ぶのは正しい書き方だ。
(そうしないと C++ ではコンパイルすらできない)
関数原型宣言はヘッダファイルでやろうな。

# ヘッダ *.h ファイルと、ソース *.c ファイルでは、ヘッダのほうが重要。
# ってあたりを納得できたら上級者だと思う。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -