3

重複の可能性:
C++ では、関数のオーバーロードは通常どのように実装されますか?

私はOOPS、戻り値と渡された引数に違いがある場合に備えて、オーバーロードされた関数について作業することについて述べたブルース・エッケルの本を読んでいました。


int fun() :: could be represented as __int__fun
float fun():: could be represented as __float__fun
int fun(int a):: as _int _fun_int

しかし、cのブロックの場合、オーバーロードはどのように機能しますか

               {
                  void fun(){}
                  ...........
                  ..
                  fun()
               }
               /......sme code/
               {
                   void fun(){}
               }

これが内部的にどのように表現されているかを誰かが説明できますか?

4

4 に答える 4

4

C++ では、ブロック内で関数を定義することはできません。

そのようなことが合法であると一瞬想像したとしても、あなたの 2 つの関数はまだオーバーロードされていません。それらは単に重複しないスコープを持っています。あなたの例はこれと同じです:

  {
     int i;
     ...
  }
  {
     int i;
     ...
  }

ここには「オーバーロードされた変数」はなく、例にはオーバーロードされた関数はありません。

于 2012-04-07T14:02:38.670 に答える
1

C では、異なるブロックで同じ名前を持つ 2 つの関数は次のように命名されます。

functionName.number

たとえば、次のような場合があります。

fun.2051

fun.2053

次のコマンドでCプログラムをコンパイルすることで、これを理解しました。

gcc -S -o test.asm test.c

次に、アセンブリ ファイルを開き、gcc が関数に付けたラベルを確認しました。

于 2012-04-07T16:57:21.817 に答える
0

ブロックは関数内でのみ発生します。C++ はネストされた関数 (つまり、別の関数内で定義された 1 つの関数) をサポート/許可しないため、この問題は発生しません。

それが許可されていれば (例えば gcc のようなコンパイラーによって拡張された場合)、それでもオーバーロードは発生しません。オーバーロードには、同じ基本名を持つ 2 つ (またはそれ以上) のエンティティが同じスコープ内で可視である必要があります。この場合、各名前は個別のスコープにあり、その場合、オーバーロードは発生しません。一致する最もローカルなスコープから名前を見つける通常のスコープ ルックアップがあるだけです。

編集: 余談ですが、あなたが示したことに反して、関数の戻り値の型は通常、マングルされた/装飾された名前に含まれていないことも追加する必要があります-関数のオーバーロードは、関数の「署名」に依存します。パラメータの型は含まれますが、戻り値の型は含まれません。

于 2012-04-07T14:02:56.213 に答える
0

C ++でのコンパイルプロセス中にオーバーロードされた関数が内部的にどのように表現されるか

Google の「C++名マングリング」。これは、このような名前を持つ通常の関数のように表されますwriteCDATA@QXmlStreamWriter@@QAEXABVQString@@@Z

しかし、ブロックの場合、オーバーロードはどのように機能しますか

あなたのコード例には有効な C++ コードが含まれていないため、コンパイルできません。

于 2012-04-07T14:04:16.903 に答える