1

Bruce Eckel による Thinking in C++ で、C++ コンパイラが関数に遭遇すると、その名前と引数を使用してその名前を装飾することを読みました。関数の場合、int func(char ch); 名前を _func_char として装飾します。戻り値の型は使用しません。

その場合、以下のプログラムでは、関数名の装飾中に戻り値の型が格納されていない場合、コンパイラはどのように「int から const char* への変換が無効です」と文句を言うのでしょうか? 誰でも明確にできますか?

#include <iostream>

using namespace std;

int func()
{
    int i = 5;
    return i;
}

int main()
{
    string str = func();
}
4

2 に答える 2

5

シンボル (関数だけでなく) の名前マングリングは、リンク段階で発生します。コンパイラ エラーが発生しています。

コンパイラはマングルされた名前を認識しません。funcを返し、パラメーターをとらない関数が呼び出されてintいることがわかるだけなので、コードが違法であることがわかります。

于 2012-05-29T09:03:14.717 に答える
5

これはコンパイル エラーです。
コンパイラは、C++ 標準仕様に従って C++ プログラムの有効性をチェックします。

ここでコンパイラがエラーを報告するのはなぜですか?

コンパイラ、関数の戻り値の型が であり、intその型の変数を初期化するために使用されておりstd::string、有効な暗黙的な変換がないことを確認できるためです。

この言語は、コンパイラがこれらの種類の型チェックを実行できるように設計されていることに注意してください。C++ は静的に型付けされた言語です。

于 2012-05-29T09:03:22.410 に答える