2012-01-13 36 views
3

このコードがなぜ機能するのかわかりません。関数の引数

int f(int,int); 

int main() 
{ 
    f(12,21); 
    return 0; 
} 

int f(int,int b) 
{ 
    return 0; 
} 

どのように私は、関数f(...)の最初の引数を使用できますか?

+6

コンパイル、任意のを無視しないでください。 –

+0

どちらもそうです。宣言される前に 'f'をどう呼び出すことができますか? – ybungalobill

+2

@ybungalobill:Cでは可能です。これは明示的宣言と呼ばれます。おそらく、彼はC++ではなくCについて話しているのかもしれません。あるいは、このコードをコンパイルするためにCコンパイラを使用しました。 –

答えて

8

パラメータ名は関数シグネチャの一部ではなく、名前とパラメータの型だけです。

したがって、パラメータに名前を付けるのは完全に正当です。ただし、使用することはできません。 - いないプラットフォームに依存しない、標準で保証はなく、楽しみではない:)

void foo (int x, int, int z) 
{ 
    int* pz = &z; 
    int y = *(--pz); 
    cout << x << " " << y << " " << z; 
} 

int main() 
{ 
    foo(2,3,4); 
    // prints "2 3 4" 
} 

これはMSVSで、Win7の上で私の作品注:

いくつかのハッキングを(もちろんしない限り、あなたは、いくつかのハッキングん)このコードは、引数が関数の引数スタックにどのようにプッシュされるかによって異なります。

プロダクションコードでは、宣言を含むすべてのパラメータに名前を使用し、できるだけわかりやすい名前にする必要があります。

+2

UBのスペルはできますか?実装された実装は、次回のコンパイル時に変更される可能性があるため、実際にはカウントされません。 (コンパイラのパブリックなドキュメントで、この特定の動作が安定していることが保証されている場合を除きます) – sehe

+0

私の主張は「それは私のために働いています」はすでにかなり伸びていると言います – sehe

6

できません。あなたはそれに名前を付けない限り。しかし、あなたはこの機能では何も使用しません。

通常、引数の名前は使用されていないという警告を避けるため省略されています。 f関数では、bが使用されていないことが警告される可能性がありますが、最初の引数は使用されません。

+0

あなたはC++で面白くて、実際にはパラメータを使用することができます:) –

+0

@LuchianGrigore、実装の詳細を知っていれば、どうでしょうか?: –

+0

もちろん面白いです。 –

2

関数内で最初の引数を使用することはできません。このコードはうまくいきました。

2

関数パラメータを使用しない場合は、関数パラメータに名前は必要ありません。

あなたが最初の引数を使用したい場合は、それに名前を与える:

int f(int a,int b) 
{ 
    return 0; 
} 

をあなたはめったにこれは関数定義で行わ見ていないが、それは宣言の中で、より一般的です。例えば

、あなたはコンストラクタは、その後何のポイントは、パラメータに名前を付けるにはありません「削除」している場合:

obj& operator=(const obj&) = delete; 
+0

タグが 'C++') –

3

あなたは使用最初の引数ことはできません。元のC言語の定義は、このようなことについて非常に容認していました。あなたがそれをやることができるからといって、それが有益な理由があるわけではありません。

+2

実際には非常に便利です。あなたが従わなければならないAPIは、あなたが望むよりも一般的です。たとえば、関数が必要なときは仮想メソッドであり、すべての場合に渡されるものは必要ありません。ほとんどの図書館ではこの機能をある程度使用しています。 – LiKao

4

f(...)の最初の引数は使用できません。欠落している変数名は、このパラメータを明示的に無視したいコンパイラに指示します。

これは一見したところでは使い物にならないかもしれませんが、実際には非常に多く、たとえば仮想メソッドのためにAPIに従わなければならない場合、関数は呼び出し元から得られるすべてのものを気にしません。

簡単な例:すべての警告と

class Painter { 
public: 
    virtual void paint(Object o, viewscreen * screen) = 0; 
}; 

class WindowPainter { 
public: 
    virtual void paint(Object o, viewscreen * screen) { 
    ... 
    } 
}; 

class ConsolePainter { 
public: 
    // The console is available as std::cout globaly 
    // often the name is just put in comments, to reference the common api 
    virtual void paint(Object o, viewscreen * /* screen */) { 
    ... 
    } 
}; 
+0

あなたは本当にしたい場合:)。 –

+0

@ルチアン:あなたの答えでそれを見て...そして、それのまさにハッキーさのためにupvoted。 – LiKao