2016-04-26 7 views
0

ホストされているシステムでは、標準でmainが "intの宣言された戻り値タイプ"で定義されている必要があります。ここで宣言されているのは、「返された型の推定」なので、この質問の目的のためにその単語を無視することができます。 Cでは、標準で明示的にtypedefintに使用できる脚注がありますが、これはC++標準にはありません。私はその意図が言語が「戻りタイプのタイプint」であり、「戻り値int」およびtypedefが単に別名であり、別のタイプではないと仮定しよう。したがって、このプログラムは法律とみなされます:この「メイン」の定義はどのように有効ですか?

typedef int boobs; 
boobs main() { } 

これを代わりに行うとどうなりますか?多くのシステムでは

#include <cstdint> 

int32_t main() {} 

int32_tだけでintではなく、すべてのシステムであるとして、これはコンパイルされます。私の混乱は、int32_tが実装定義の値であるという事実に由来します。つまり、コンパイルの失敗は実装に依存します。

この状況の合法性は何ですか?プログラム全体がコンパイルされているかどうかを判断できないので、プログラム全体が不正ですか?あるいは、それは標準ライブラリから来る実装定義の値に依存するため、整形式ですか?

+0

'私たちはその言葉を無視することができるので、この - –

+1

の私をこのままにしておいてください。つまり、 'int32_t'が' int'の場合にのみ動作し、 'int'を最初に使用することができます。 – user463035818

+1

"コンパイルの失敗は実装に依存します "---はい、それはまれではありません – Brian

答えて

4

int32_tintのエイリアス(typedef)である場合にのみ、プログラムが整形されます。

明らかに、int32_t(固定幅の整数はオプション)をサポートしないシステムでは、宣言されていないint32_tの使用は不正です。 int32_tは、コンパイラによってサポートされていても

また、(のみstd::int32_tが保証される)ヘッダ<cstdint>のグローバルネームスペースでそれを宣言するために必要なので、プログラムは、実施の態様に依存していません。

int32_tintとは別のタイプのシステムでは、プログラムが不正に作成されます。

したがって、プログラムが正常に形成されているかどうかにかかわらず、実装が定義されています。いくつかのシステムでは、他の人にはそうではありません。それをさらに簡潔にするため、プログラムは条件付きで整形式です。

関連する問題