これをGCC 4.6で試してみると、コンパイルとリンクが行われますが、実行時にMacOS上で「バスエラー」メッセージが表示されます。 VS2010はそれをコンパイルしません。これは正しいC++ 0xコードですか?
しかし、これは実際には標準のC++ 0xで動作するのでしょうか?
#include <cstdio>
int (*main)()=[]()->int{printf("HEY!\n");return 0;};
はい、「メイン」をラムダ関数として定義することです。
これをGCC 4.6で試してみると、コンパイルとリンクが行われますが、実行時にMacOS上で「バスエラー」メッセージが表示されます。 VS2010はそれをコンパイルしません。これは正しいC++ 0xコードですか?
しかし、これは実際には標準のC++ 0xで動作するのでしょうか?
#include <cstdio>
int (*main)()=[]()->int{printf("HEY!\n");return 0;};
はい、「メイン」をラムダ関数として定義することです。
いいえ、これは正しくありません。
メインは特別な関数であり、厳密な要件があります(通常の関数よりも厳密です)が、関数とは何か、そして関数のポインタとは何か混乱しています。
論理的な問題は、関数と、関数へのポインタを保持している変数(主にしたいもの)との間に違いがあることです。 関数はメモリ内の固定アドレスを持っているので、単にアドレスが呼び出される関数を呼び出すことができます。関数へのポインタをメモリ内のアドレスにポイントするので、ポインタが何を指しているのかを最初に読んでそのアドレスを呼び出すために必要な関数を呼び出すことができます。
関数へのポインタは、関数とは異なるレベルの間接参照を持っています。
構文は、ポインタの場合には(x
あなたはx(42)
を書くことができます関数へのポインタですが、x
ではなく、関数の場合、まだ生成されたマシンコードが異なる場合つまり...値と同じである必要がありますルックアップされ、呼び出しアドレスは実行時に決定され、アドレスは固定されている(再配置まで)。リンク時に決定される。
<cstdio>
を#includeすると、printf()はstd :: printf()でなければなりません。そして無効なmain()についての他のもの。
いいえ、 'cXXX'がグローバル名前空間への注入を含むかどうかは、標準では不明です。 'std ::'を使うのは_wise_ですが、 "must"はおそらく過剰です。 – paxdiablo
これはとにかくハーフジョークでした。私はそれが移植性のために必要であることに注意するために答えを編集します。 (生き方のために移植可能なコードを書いている人は、このように考え始めます...) –
今、コンパイルするべきではありません。ラムダ式は型(ファンクタ)を生成します。
型から関数ポインタへの暗黙的な変換はありません。
コンパイラによっては、main
関数はC++またはCリンケージ(実装定義)を持つことができます。ラムダ式は、関数呼び出し演算子を持つC++型を返します。したがって、C++リンケージです。
私はあなたがC++ 11の最新の最高の高度な機能を使いたいと思っていますが、まだ 'cstdio'と' printf'を使用しています:-) – paxdiablo
@paxdiablo:printf rocks !!! I/OストリームでC++が失敗しました:) –
Stroustroupによると、Cで足を撃つことができれば、C++は足を吹き飛ばすことができます!これは私が「マゾヒズム」と呼ぶものです! I/Oは、プロジェクト内のストリームおよびそれらに古いC IOシステムより遅い10〜20倍を見つけ、私は古いものに固執してきたみました後:-)) –