2012-01-15 8 views
15

私が(本は1993年に印刷された)Cのコードの難読化についての古い本を読んでいます、と私は引数を持つ関数がこのように実装されていることに気付きました:関数の引数の型を ")"の後に定義するのは非常に古い標準ですか?

real_dump(address, infunc, ofp) 
char *address; 
int (*infunc)(); 
FILE *ofp; 
{ 
    /* the code goes here... */ 
} 

また、ノーリターン型がありません定義された。

これは古い標準ですか? gccがこのコードをコンパイルできるようにすることは可能ですか?

+10

この構文は1993年にさえも古いものでした:) – dasblinkenlight

+1

HP-UXにバンドルされているコンパイラは現代のシステムでもこれをサポートしていると思います。ANSI Cコンパイラは追加費用がかかります。したがって、非常にシンプルなCプログラムをコンパイルする必要がある場合、この構文が実際には便利であることがわかっています。 –

+0

1993年に、古い構文を使用することは不合理ではありませんでした。ネイティブコンパイラが標準Cをサポートしていなかったマシンがまだありました。多くはありませんでしたが、いくつかありました。プロトタイプが自動的に使用可能になるのに十分普遍的であったのは90年代後半(1996年以降)までではなかった。国境に近いが、1993年にはまだ正当化されている(ただし、本のどこかに明確化があったはずである)。 –

答えて

19

非プロトタイプ形式の関数定義は、有効なC89、C99、C11コードです。

旧式の関数定義と呼ばれていますが、この機能はC89以降廃止された機能としてマークされています。

このフォームは、でなく、新しいプログラムで使用されるである必要があります。

C99理論的根拠は述べています:

「廃れがその使用を 阻止すると 新しいスタイルの委員会による強い裏書として機能するものであるとして、古いスタイルを特徴づけます。」

でもK & R2は、その使用を阻止:

「宣言と定義の古いスタイルは、まだ少なくとも移行期間のために、ANSI Cで動作しますが、私たちは強く、あなたが新しいを使用することをお勧めしますあなたがそれをサポートするコンパイラを持っているときにフォーム。

この関数も戻り値の型を持たず、関数宣言または関数定義の戻り値の型を省略すると、C99以降は無効になります。 C99以前は、戻り値のない関数は暗黙的にintを返しました。

gcc質問については、デフォルトでgcc-std=gnu89とコンパイルされます。これはC89標準+ gcc拡張を意味します。したがって、デフォルトでは、gccは関数宣言と定義を持つプログラムを古い形式の形式で、戻り値のない形式でコンパイルすることを受け入れます。

9

これは、関数を定義する前のANSI Cの方法でしたが、「通常の」コードでこの種の構文を使用することは実際にはお勧めしません。それでも、gccは問題なくそのまま受け入れているようです(§6.11.7で "陳腐化"とマークされていますが、これはまだ標準です)。

(適用されるべきである方法によって、「行方不明」の復帰に関しては、「暗黙のルールint」と入力)

+2

+1は "嫌な"です。実際にK&R Cを使用する言い訳はもうありません... –

2

戻り値の型の欠如は、戻り値の型がintであることを意味します。これがデフォルトです。

4

これは、関数宣言スタイルのスタイルです。これは、Kernighan and Ritchieです。 K & R CはANSI Cに先行していました。ANSI Cは、現在最も一般的に使用されているC++スタイルの関数プロトタイプを追加しました。

関連する問題