問題タブ [function-declaration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 関数の宣言と使用を区別する方法は?
コードには次の構造があります。
私は何を理解できませんaaa::bbb::ccc some_name(
。関数の呼び出しである場合、なぜその時間を指定する必要があるのでしょうかaaa::bbb::ccc
。関数の宣言なら、なぜ while ループで行い、引数の型を指定しないのですか?
c++ - C++ インライン関数は、後でヘッダーで宣言された関数を呼び出すことができますか?
以下は、MSVC2008 および MSVC2010 で問題なく動作します。
はい、これはちょっと奇妙です: (その時点で)はまだ宣言されていませんが、 をFuncA()
呼び出します。ただし、MSVC2008 と MSVC2010 はこれで問題ないと考えています。FuncB()
FuncB()
どうやら、gcc
これでいいとは思えない―― FuncB was not declared in this scope
。
問題: 私はこれらをたくさん持っていますが、それらを宣言して後で定義するのは「苦痛」です。さらに、それらを適切に「順序付け」するのは難しいため、それぞれが宣言された後にのみ関数を呼び出します。 しかし、最初に宣言してから定義する必要があると思いますか?
これらの関数がテンプレートであるかどうか、またはテンプレート クラス内で定義されているかどうかでルールが異なりますか?
gcc
具体的には、Microsoft が大量の相互結合コードを受け入れる非常に「遅いコンパイル」であることに気付きました。 「コードを見る」(正確さのための最初のパス、およびパラメータ化/呼び出し中に再び)。
(この問題は、Microsoft コードを Linux/gcc に移植するときに発生します。)
===更新===
以下は、(このコード移植作業で) 私たちが持っている「代替」シナリオであり、これらのいずれかに基づいてあなたの答えは変わりますか?
...と:
===UPDATE+2===
コンセンサスはこれが有効なC++コードであり、機能するはずであるコメントをありがとう(@Adamが示唆したように、関数「定義済みインライン」はクラスの後に定義されているかのように動作し、定義された関数を呼び出すことができるはずですそのインライン定義の後のクラス インターフェイスで)。
詳しくは:
はい、FuncA()
インライン実装の最初の例で実際にこのコンパイル エラーが発生しました。
...使用:
(これは MSVC2008/MSVC2010 で機能することを思い出してください)。
私のコード例 (上記) が不十分であることに気付きました (上記の例では、このエラーは表示されませんgcc
)。詳細は次のとおりです。
Foo
基本クラスがあります(それは問題ではないと思います)Foo
これらの機能を通過する内部enum
を定義します(これは問題ではないと思います)- これらの関数は、マクロを介して「展開」されます(重要だと思います-以下を参照)
- これらの関数は 56 個あります (重要だと思います -- 以下を参照してください)。
より完全なコード例は次のようになります (これは自慢ではありません)。
コード の意図:FooParent
基本クラスには、(多くの) 派生クラスによって「共有」されることを意図した実装があります。派生クラスは独自のenum
値を定義します。これらの値を使用する関数はenum
、マクロを介して実装されました (FooParent
は ではなくtemplate<>
、派生した に依存できないためenum
)。
奇妙な行動:
FooA(){FooB();}
ネストが「数行」だけで「後で」定義された関数を参照する場合、正常にgcc
コンパイルされます。ただし、まだ宣言されていない関数が のようにずっと後の場合Foo2(){Foo53();}
、それはクラスのメンバーではないgcc
と結論付けFoo53()
ます (ただし、メンバーです)。
これが私が起こっていると思うことです:
- 物理的に「1 行」にある大量のコード (56 個の関数) に問題があるようです。これらの関数をマクロから削除し、エスケープ行末を削除すると、正常にコンパイルされます。
\
gcc
したがって、(コード移植)答えは次のとおりだと思います。
- プリプロセッサ マクロを使用しないでください
- から派生した
FooParentBase<>
テンプレート クラスを作成しFooParent
、そこから を派生させます。これには、テンプレート パラメータとしてFoo
が必要です。typename Foo::enum
私はこれらの変更に問題はありません (私はマクロが好きではありませんでした) が、gcc
ここに問題があるように見えるのは奇妙だと思います。
これを修正する方法について他の提案はありますか? (上記のリファクタリングはあなたがすることですか?)
python - 関数内の関数はどのように呼び出されますか? それらの関数にアクセスできますか、それとも「ヘルパー メソッド」のように機能しますか?
The Python TutorialでPythonの勉強をしていて、現在Classes(第9章)にいるのですが、「スコープと名前空間」の説明中に質問がありました。
著者は次の例を挙げています。
ソース: http://docs.python.org/3.3/tutorial/classes.html#scopes-and-namespaces-example
私が今まで知っていることから、キーワードdef
は関数を定義するために使用され、関数はクラス内に配置されますが、この場合、彼は関数内で関数を定義しました。つまり、別の関数内のこの関数は何と呼ばれますか?
最初の関数の外側からアクセスできる方法はありますか? たとえば、scope_test が含まれている名前空間から。
関数内のこの関数は、プライベート メソッドの場合、Java や C# などの他のプログラミング言語で呼び出される「ヘルパー メソッド」のように機能しますか?
javascript - JavaScript 関数式
次の行:
A() のみが関数を呼び出します。def() はしません。なぜそうなのですか?左辺は関数のデラレーションではないでしょうか?
c++ - 定義する直前に関数を宣言する理由は?
したがって、この別の古い巨大な C++ コードベースでは、このスタイルをよく見かけます。
一般に、C++ で関数を前方宣言する意味は理解できますが、この種の重複を正当化する理由が見つかりません。それを排除しない理由はありますか?
javascript - 「foo = function()」スタイルのコーディングのための JS の Caller プロパティ
ここで定義した関数に「caller」のプロパティを使いたい
このスタイルの関数宣言では問題なく動作します
しかし、私の関数宣言は次のようなものです
そして、私は未定義になっています(基本的に何も得られません)
コードを書き直さなくても caller プロパティを使用できる方法はありますか? また、私は JS を使用するのが初めてなので、使用方法と関数の宣言に誤りがなかったことを願っています。
c - [ ] は C の宣言子でもありますか (パラメーター宣言で使用する場合)?
6.7.6 宣言子は言う
各宣言子は 1 つの identifierを宣言し、宣言子と同じ形式のオペランドが式に現れると、宣言指定子によって示されるスコープ、保存期間、および型を持つ関数またはオブジェクトを指定することをアサートします。
また、パラメーターの 構文についても述べています。
指定された関数プロトタイプについて
int a[]
a[]
identifier を宣言するdeclarator を使用してパラメーターを宣言しますa
。
の場合には
int []
宣言パラメーターは、識別子のないint の配列です。宣言子でもありますか
? []
(識別子を宣言していないため、いいえだと思いますが、パラメーターの構文はそうです!)