1

戻り値を処理せずに自作関数を呼び出そうとしました。gcc は、関数呼び出しの行で、これは効果のないステートメントになると私に言いました。関数が呼び出されるかどうかを確認するために、いくつかの printf ステートメントを追加しましたが、プログラムからの出力は得られませんでした。

gcc が単に関数呼び出しを無視する可能性はありますか? 私の知る限り、そのような発言に問題はありませんでした。

コードは次のとおりです。

unsigned strlen(char *string)
{
  printf("ignored by gcc");
  unsigned count = 0;
  for(; *string++; count++);
  return count;
}

int main()
{
  char string[] = "something";
  strlen(string);

  return 0;
}

前もって感謝します。

4

2 に答える 2

7

関数の戻り値を無視することは完全に合法です。おそらく、呼び出す回数の99%以上を実行しますprintf()(これはを返しますint)。

ただし、コメントで何人かが言っているようstrlen()に、標準ライブラリ関数の後に関数を呼び出しました。これは、C99の7.1.3:2によると違法です。

プログラムが予約されているコンテキスト(7.1.4で許可されている場合を除く)で識別子を宣言または定義する場合、または予約された識別子をマクロ名として定義する場合、動作は未定義です。

ここで、コンパイラは予期せず警告を発し、あなたの代わりに標準関数を呼び出すか、関数をまったく呼び出さない(副作用がないはずであることがわかっているため)。 strlen()これは、未定義動作で実行できることの1つです。

于 2012-09-21T19:57:23.613 に答える
2

strlengccは で宣言されているため、メッセージが表示されます__attribute__((pure))。これは、副作用がないことをコンパイラに伝えるため、戻り値を使用する以外に呼び出しても意味がありません。

于 2012-09-21T20:46:33.807 に答える