同じC++といっても環境や実装に依存した物がたくさんあります。
C++はISOの規格として標準化されており、最新はC++14です(今年C++17が出る予定です)。しかし、全てのコンパイラが最新規格の全ての機能に対応しているわけではありません。ただ、Visual Studio 2015(コンパイラ部分はVisual C++とも言われる、以下コンパイラ部分はVC++と表現)よりはXcode(コンパイラはLLVMを使用、以下コンパイラ部分はLLVMと表現)の方が対応している機能が多いので、対応していない規格を使用していたという可能性は低いでしょう(LLVM⇒VC++の場合は未対応でこけることがよくあります)。
次に、規格としてはあるけど、必ずしも実装する必要が無い機能があります。たとえば、C++というよりC11なのですが、scanf_s
というscanf
をセキュリティ拡張した関数は規格上はオプション扱いで必須ではありません。VC++では実装されていますが、LLVMでは未実装です。そのため、このような関数を使用している場合、VC++ではコンパイルできてLLVMではコンパイルできないというのもあります。他にも規格には存在しないコンパイラ独自の拡張が存在します。独自の拡張を使用している場合は、もちろん片方ではコンパイルできません。
他にもプラットフォーム特有の関数やライブラリがあります。たとえばWindowsではデスクトップアプリケーションはWinMain
から始めますが、これはWindows特有のエントリーポイントであり、他のプラットフォームではエントリーポイントと見なされません。実行形式として作成する場合、他にmain
がなければ、リンカでmain
がないとされ、エラーになるでしょう。その他、Win32APIといわれる関数もWindows独自ですし、Win32APIで使用するWORD
やLPTSTR
などの型もWindows独自です。これらを使用していれば、MacやLinuxなど他の環境ではコンパイルすることができません。ヘッダも環境特有が存在し、windows.hというWindowsでは重要なヘッダもWindowsにしか存在しません。
最後に問題になるのは文字コードです。Visual Studio 2015でデフォルトで作成するとANSI(日本語環境ではWindows-31J)になります。日本語環境のWindows-31JはShift_JISの亜種です。対して、XcodeでのデフォルトはBOM無しUTF-8です。ASCIIのみであれば全く同じになるので問題が出ませんが、平仮名や漢字が含まれている場合、異常な文字コードとしてエラーになる場合があります。ASCII以外の文字がある場合は、文字コードを変換するなどの何らかの対応をしないとコンパイルすることはできません。
他にもクロスプラットフォーム(複数のプラットフォームで動かすということ)でC++を書く場合は多くの留意すべき事があります。実際にコンパイルや実行してみて、エラーを一つ一つ確認していくしかありません。クロスプラットフォームで苦労したくない場合は、C++でもQtなどある程度プラットフォーム間の差異を吸収しているくれるものを使うとか、プラットフォーム間に差異が少ない言語を使うとか、なんらかの工夫をしています。素のCまたはC++でのクロスプラットフォーム開発は、よくわかっている人ではないとわりと厳しいと思ってください。