2012-03-02 22 views
5

可能性の重複:
Error: No previous prototype for function. Why am I getting this error?以前のプロトタイプはありませんか?

しかし私は、XcodeのはまだNo previous prototype for the function 'printBind'を警告私を与え、私はヘッダファイルでプロトタイプ機能を持っています。私は同じ方法でsetBindプロトタイプ関数を持っていますが、私の実装ではこの関数の警告が出ません。 Cにおいて

CelGL.h

#ifndef Under_Siege_CelGL_h 
#define Under_Siege_CelGL_h 

void setBind(int input); 
void printBind(); 

#endif 

CelGL.c

#include <stdio.h> 
#include "CelGL.h" 

int bind; 

void setBind(int bindin) { // No warning here? 
    bind = bindin; 
} 

void printBind() { // Warning here 
    printf("%i", bind); 
} 

答えて

19

、これ:

void printBind(); 

プロトタイプではありません。何も返さない関数を宣言しますが(void)、不確定な引数リストをとります。 (ただし、引数のリストは変数ではなく、可変長引数リストを取るすべての機能がは未定義の動作を避けるために、スコープで完全なプロトタイプを持っている必要があります。)なしをとる関数のプロトタイプだ

void printBind(void); 

議論

C++のルールは異なります。最初は引数のない関数を宣言し、2番目の関数と同等です。

違いの理由は歴史的です( '1980年代半ばまでの日付'を参照)。プロトタイプがC言語に導入されたとき(プロトタイプが追加される前のオプションではなかったため)、引数リストのない関数を宣言する膨大なコードが残っていたため、後方互換性の考慮事項SomeType *SomeFunction();は、「SomeType *を返す関数ですが、引数リストについては何も知らない関数」を意味し続ける必要がありました。 C++は最終的にCとの互換性のためにSomeType *SomeFunction(void);という表記法を追加しましたが、タイプセーフなリンケージが早期に追加され、定義または使用される前にすべての関数がプロトタイプを必要としていたため、

+0

私はエラーの理由を理解することができましたが、この機能の有用性を理解していません。不確定なパラメータリストを持つ関数をいつ定義しますか?これはC++と正確に何が関係していますか?これはC++の便利な機能ですか? – sherrellbc

+0

C++で不確定な引数リストを持つプロトタイプを定義することはできません。 C++では、「引数がない」ことを意味し、「不確定な引数」は意味しません。この機能は、現実に必要な譲歩としてあまり有用ではありません。 Cが標準化されたとき、広大なコードベース全体がプロトタイプなしで書かれました。彼らはCに存在していなかった。空のかっこの表記法は、標準化前のCにすべて存在していた。不法とするために、それは初期のCの標準を殺したであろう。それはC99でもまだ当てはまりました。 C11ではあまり明確ではありませんが、変更されませんでした。 –

関連する問題