1

変数名を使ってデータ型を知りたい

私の最終的な目標は、関数スタブ (スケルトン コード) を作成するための関数シグネチャを取得することです。

ただし、GCCエラーメッセージは未定義の関数名のみを通知するだけです

シンボルテーブルを見ることはできますか? (関数シグネチャの推論用)

たとえば、foo.c は次のようになります。

#include <stdio.h>

int main() {
    int n = 0;
    n = foo();
    return 0;
}

関数スタブを作りたい

関数 foo にはパラメーターがなく、整数値を返すことを知りたい

私は何をすべきか?

私は以下のように考えています。

  1. 関数 foo が未定義であると言うリンカ エラー メッセージ

  2. 5行目を読む

    n = foo();

  3. 記号テーブルを使用して n の型を調べる

それは正しいですか?

私の悪い英語でごめんなさい

関数シグネチャの推論を教えてください

4

4 に答える 4

0

大丈夫そうに見えますが、この戦略は十分ではありません。式の左辺を使用するだけでは、関数の戻り値の型を決定するのに十分ではありません。特に、単純に左辺がまったくない場合がありますfoo();。じゃあ何?

于 2013-07-16T00:45:14.303 に答える
0

つまり、foodefined whereという名前の関数があり、その型を知りたいとします。

food ヘッダー ファイルのどこかに実際にプロトタイプがない場合#include、これは簡単です。

  • C99 を使用している場合、コードは無効です。
  • それ以外の場合は、foo引数を取らずに を返す必要があります。そうしないとint、コードが無効になります。

そして、これは「技術的に無効ですが、すべてのプラットフォームで機能する」ケースの 1 つではありません。それ壊れます。たとえば、64 ビット x86 Linux または Mac 用の gcc 4.2 では、次のようにします。

double foo(double f) { return f*2; }

次に、ヘッダー ファイルなしで、次のように呼び出します。

double f = foo(2.0);
printf("%f\n", f);

C89 としてコンパイルされている場合、これは問題なくコンパイルおよびリンクされ (clang または gcc 4.8 では警告が表示されますが、gcc 4.2 ではデフォルトでは警告が表示されません)、実行され、出力され2.0ます。少なくとも x86_64 では。ARM7 では、スタックが破損し、運が良ければ segfault が発生します。(もちろん、実際には 2.0 または初期化されていないランダムな値のいずれかを 2 倍にしますが、それを返すことはできません。呼び出し元がアクセスすることを知らない任意の浮動小数点レジスタに格納されています。)


ヘッダー ファイルにある場合、いつでも検索できます。emacs、グラフィカル IDE などは、この点で非常に優れています。しかし、コンパイラを使用すると、2 つの方法で問題を解決できます。

まず、これを行うだけです:

gcc -E main.c > main.i
less main.i

を検索すると/foo、見つかります。

または、perreal の回答のように、コンパイラをだましてエラー メッセージを表示させることもできます。

于 2013-07-16T01:24:01.340 に答える