2017-03-15 20 views
-1

Cに前方宣言関数を持たない次のプログラムをコンパイルしました。それは正常にコンパイルされ、警告またはエラーなしでGCCで実行されます。C++で前方宣言が欠落する問題

#include <stdio.h> 

int main() 
{ 
     int ret = func(10, 5); 
} 

int func(int i, int j) 
{ 
     return (i+j); 
} 

しかし、私は前方C++で関数を宣言しなくても、次のプログラムをコンパイルして、コンパイラは私にエラーを与えます。

#include <iostream> 
using namespace std; 

int main() 
{ 
     int ret = func(10, 5); 
} 

int func(int i, int j) 
{ 
     return (i+j); 
} 

エラー:

fl.cpp:6:22: error: ‘func’ was not declared in this scope 
    int ret = func(10, 5); 
        ^

C++コンパイラはエラーを与えるのはなぜ?デフォルトではint型のデータ型ではありませんか?

+10

決して、もはやCで99 – StoryTeller

+1

以来*「なぜC++コンパイラはエラーになります?」*いつものように:標準がそう言うので。 –

+1

@CraigYoungは "no fwd decl ..."と読んでいます。 –

答えて

3

これは、C++の場合と同じくらいC言語でも問題ありません。質問のコードはビューのCコンパイラの観点から有効であることを「仮定」に基づいており、私はそれを詳しく説明しましょうを考慮

は、スペック(C11)に従って、機能の暗黙的な宣言ではありません許可されます。厳密に準拠して、あなたのコードをコンパイルし、(任意の準拠)コンパイラはC.

See live example

C11を引用、まえがき/ P7で同じエラーが生成されます、第二版で」の主な変更点は以下の通り「

  • remove implicit function declaration

と同じも、C99に存在します。


注:このコードは正常にコンパイルされることが事前C99

を働いている可能性がある理由については、実際に部屋がありました。関数プロトタイプが欠落している場合は、関数がintを返し、任意の数のパラメータを入力として受け入れると仮定しました。これは非常に非標準的なものであり、レガシーサポートを持つコンパイラは、そのようなコードをコンパイルできるように選択するかもしれませんが、厳密に言えば、適合するコンパイラはこれを拒否すべきです。

+0

C99以降のコンパイラは、コードを拒否します。 1999年よりも古いコンパイラは、または「C89」のモード(例えば 'gccの-stdc89')で、一般的にC99の遵守を主張しません。 – Peter

+0

@Peterは時々あなたがオプションを使用して「遵守」を徹底する必要があり、それはデフォルトではありません...それは私はコトだすべてです。 –

1

Why C++ Compiler Gives an Error?

C++で宣言されていない関数を呼び出さないでください。

Is it not by default take int data type?

他の言語の場合のために使用号、これはC++ではそうではないC.。

0

C++では、宣言されていない関数を呼び出すことはできません。 C言語では、関数の定義がintを返す場合、前方宣言子なしで関数を呼び出すことができます。これは、古い関数K & Rの関数定義スタイルのためです。これはANSI-Cでは時代遅れであり、常にプロトタイプで関数を宣言します。

+0

これはちょっとした問題であり、ほとんどが非常に間違っています。宣言されていない機能に遭遇したとき、Cコンパイラは、宣言を(全く実装は見出されていない場合、リンカーは、その後文句であろう)を前提としています。仮定が偽、すなわち、コードの後に​​宣言または実装が見つかったときに、 – parvus

+0

が仮定と一致しないとき、コンパイラエラーが与えられる。これは、コンパイラのバージョンとコンパイラフラグの影響をさらに受けます。はるかに最良のアドバイスです:それをしないでください。常に正面を宣言します。 – parvus

+0

@parvus、はい、Cコンパイラは宣言を引き継ぎます。これは、関数宣言子にパラメータがなく、関数がintを返す古いK&R C関数スタイルの遺産で、宣言が省略されている可能性があります。 –

1

画像を完成させるためには、答えとの関係でSourav Ghoshを入力してください。ここではC++標準では、問題について言っているものです。

[expr.call] p2

[ Note: If a function or member function name is used, and name lookup does not find a declaration of that name, the program is ill-formed. No function is implicitly declared by such a call.  — end note ]

が、それ以上の明示的な取得できませんでした。

C++で