1章 最小のプログラム
http://www.geocities.jp/ky_webid/cpp/language/001.html
int main () {}
C++ではCのようにANSI C以前の構文をサポートしていないので、引数が存在しない場合に(void)とわざわざ書く必要がない。
また、main関数のreturnは省略可能な仕様らしい。
Hello Worldの出力
#include <iostream> int main() { std::cout << "Hello World!\n"; return 0; }
Cとは色々と違いますね。まずよく使っていたprintfじゃなくてstd::coutという見慣れないものを使っています。
またiostreamというヘッダを読み込んでいます。iostream.hとは違うんでしょうか?
ヘッダファイルのインクルードですが、 iostreamという名前になっており、拡張子がありません。古い形式のC++ では、ヘッダファイルがiostream.hという拡張子付きの名前だったため、それと区別を付けるため、新しいC++規格では、標準ヘッダファイルから拡張子を取り払いました
とのことですが、色々調べてみたもののよく意味がわかりません。ここはまたいづれちゃんと調べないといけないですね。<<演算子は左シフトのように見えますが、違うらしいです。この辺の説明はまた後ででてくるようなのでここではとりあえずこういうもんだという風に覚えておきます。
とにかく上記のコードをコンパイルしてみました。すると・・・
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(114) : warning C4820: '_wfinddata64i32_t' : '4' バイトのパディングを データ メンバ '_wfinddata64i32_t::attrib' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(119) : warning C4820: '_wfinddata64i32_t' : '4' バイトのパディングを データ メンバ '_wfinddata64i32_t::name' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(123) : warning C4820: '_wfinddata64_t' : '4' バイトのパディングを データ メンバ '_wfinddata64_t::attrib' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(493) : warning C4820: '_stat32' : '2' バイトのパディングを データ メンバ '_stat32::st_gid' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(509) : warning C4820: 'stat' : '2' バイトのパディングを データ メンバ 'stat::st_gid' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(525) : warning C4820: '_stat32i64' : '2' バイトのパディングを データ メンバ '_stat32i64::st_gid' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(526) : warning C4820: '_stat32i64' : '4' バイトのパディングを データ メンバ '_stat32i64::st_rdev' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(530) : warning C4820: '_stat32i64' : '4' バイトのパディングを データ メンバ '_stat32i64::st_ctime' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(539) : warning C4820: '_stat64i32' : '2' バイトのパディングを データ メンバ '_stat64i32::st_gid' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(553) : warning C4820: '_stat64' : '2' バイトのパディングを データ メンバ '_stat64::st_gid' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wchar.h(554) : warning C4820: '_stat64' : '4' バイトのパディングを データ メンバ '_stat64::st_rdev' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\typeinfo(58) : warning C4820: 'type_info' : '3' バイトのパディングを データ メンバ 'type_info::_m_d_name' の後に追加しました。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHsc を指定してください。
まただ・・・。
何故標準でついてくるライブラリを読み込んだだけで警告が出るのか物凄く謎です。しかもどうすればいいのか全然わかりません。
こういうのって無視すればいいんでしょうか。
とりあえずC4820ですが、どうもアライメントが関係しているようです。なんとなく無視してもよさげ?よくわかりません・・・。
C4530に関しては情報がありました。
例外処理が有効になるようにコンパイルしないといけないみたいです。/EHsc を指定すればいけるようですね。
ということでこれらを踏まえた上で再度コンパイルしてみます。
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ios(105) : warning C4710: 'std::string std::_Locinfo::_Getname(void) const' : インライン関数ではありません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocinfo(112) : 'std::_Locinfo::_Getname' の宣言を確認してください。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ios(105) : warning C4710: 'std::string std::locale::name(void) const' : インライン関数ではありません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(406) : 'std::locale::name' の宣言を確認してください。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\ios(105) : warning C4710: 'std::locale std::ios_base::getloc(void) const' : インライン関数ではありません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xiosbase(429) : 'std::ios_base::getloc' の宣言を確認してください。
まだ出るのかよ!
どうも色々調べていくとどうやら/Wallが厳しすぎて本来無視される警告みたい?
Download Visual Studio 2005 Retired documentation from Official Microsoft Download Center
Download Visual Studio 2005 Retired documentation from Official Microsoft Download Center
このあたりを読むと、/W4を使うのがベストのようですね。
というわけで/W4に変更してコンパイルしてみたところ、すっきり通りました。
$ cl /W4 /EHsc main.cpp
なるほど。
今後は/W4を利用していきたいと思います。