2017-10-23 19 views
2

Microsoftの言語拡張機能なしで私のVS2017 C++プロジェクトをコンパイルできるようにしたい。ここでの回答に基づいてVS2017で/ Zaを使わずにファイルを/ Zaで残りのファイルをコンパイルする方法はありますか?

/Za compiler directive does not compile system headers in VS2010は、VSはザ/なし一つのファイルをコンパイル作るための方法、およびとの残りの部分はありますか?

特に/ザフラッグを好きではないファイルがWINNT.Hで、私のファイルのいくつかは、それを使用しています。

+1

1つまたは2つの.cppファイルに対して特定のコンパイラオプションを設定することができます(右クリックしてください) –

+1

/Zaの代わりに/ permissive-を使用してすべてをコンパイルしようとしましたか? – Jodocus

+1

/Zcの下に、より具体的な[適合オプション](https://msdn.microsoft.com/en-us/library/w455da8a.aspx)があり、/ Za(すべて)を使用する必要はありません。また、警告レベル4では、非const参照に一時的にバインドするような厄介な拡張機能を使用すると、コンパイラは警告します。 –

答えて

1

これは私が実現よりも痛いほど単純でした。 > C \ C++ - - >言語 - >言語拡張機能の無効化 - >はい(/ザ)

  • ヒットOKを

    1. は右、ソリューションエクスプローラでプロジェクトをクリックし、プロパティにアクセスしてください。

    あなたが追加した新しいファイルは/ザを使用するものは何でも今。

    1. Shiftを押しながら、必要なファイルをすべて選択します。ではなく、/Zaを使用します。第

    に今設定を無効にする言語拡張を除く

  • ステップ1を繰り返し今だけそれらのファイルが、Microsoftの言語拡張を構築します。

    プロジェクトのデフォルトから継承を停止するようにファイルを設定する必要はなく、/ Zeまたは/ Zcや手動コマンドラインを使用することなく、vcxproj編集(および作成する手間が省けます)を行う必要はありません。私が無駄にした時間は、これがいかに単純かを気づかなかった。 > _ <

    他のいくつかの注意事項:提案ここでは、さまざまなレバーを引い&をプッシュするおかげで、私は次のことを発見した:

    • で議論/ permissive-コマンドラインオプション、 Visual C++ Team Blog(ありがとうJodocus)明らかに私が必要なものを行います。しかし、私はそれが単に匿名の構造体をキャッチしていないことを発見しました。おそらく私は何か間違ったことをしましたが、私のコードをISO C++の適合に強制していませんでした。

    • /Zc compiler optionsには匿名の構造は言及されていないため、そのうちの1つが匿名の構造体に準拠していない場合、どの構造体が偽装されているかわかりません。それはISO C++の1つのことなので、明示的にカバーすることができませんでした。私はこれらのフラグについても信仰を失いました。

    • 違反ファイルがヘッダーファイルの場合、その違反ヘッダーを含むすべてのソースファイルに対して、その/ Zaを無効にする必要があります。

    • 最後に、これはプログラムで行うこともできます。 DisableLanguageExtensionsを参照してください。

  • 2

    Visual Studio devs:

    コンパイラスイッチによると/ Zaが努力は、いくつかのC++コンパイラを越え 厳密ポータブル行動を切り開くために数十年前に始まりました。努力は、 が停止しており、新しいプロジェクトにはもはやお勧めしません。 /Zaスイッチは、特定の主要なMicrosoft SDKヘッダーファイルをサポートしていません。 By contrast/permissive-は、入力C++ コードがISO C++ルールに従って解釈される便利な適合モードを提供しますが、 Visual C++でサポートされるターゲットでC++をコンパイルするのに必要な準拠の拡張子も になります。たとえば、C++/CLIで/ permissive-を使用できます。 コンパイラスイッチ/ Zaは、いくつかの準拠していない構文を拒否します。しかし、 適合コードのためにコンパイラスイッチ/許容 - 私たちの推薦は です。

    そのため、代わりに/Zaを使用して、単一の翻訳単位の例外を実装しようとしているの/permissive-でプロジェクト全体をコンパイルすると、ISO-Cに準拠している++および非標準のMicrosoftのヘッダファイルをコンパイルすることができることとの間に許容ペイオフかもしれません。

    コンパイラスイッチ/ Zcは:strictStringsおよび/ Zcは:さらに、あなたは/Zcフラグとそのオプションを利用することによってより多くの拡張機能を無効にすることができrvalueCastは非準拠の動作をできるように、デフォルトでは現在 オフになっています。スイッチ /permissive-はデフォルトでオンになります。/ZCフラグ /permissive-を渡して、必要に応じてこの動作を無効にすることができます。

    +0

    スーパーは役に立ちましたか、聞いたことがありません。実際に私は今日までこれについて何も聞いていなかった。どうもありがとう。 – Xenial

    +0

    しかし/ permissive-でも、私のコードは匿名の構造体でコンパイルできます。/Zaはそうではありません。 – Xenial

    1

    いえば技術的には、これは、ファイルのグループ全体にいくつかのメタデータを割り当てるが、MSBuildのを使用して一つのファイルにそれを無視する方法である:

    <ItemGroup> 
        <Compile Include="**\*.cpp" Exclude="foo.cpp"> 
        <SomeCompilerSettingMetaData>/Za</SomeCompilerSettingMetaData> 
        </Compile> 
        <Compile Include="foo.cpp" > 
        <SomeCompilerSettingMetaData></SomeCompilerSettingMetaData> 
        </Compile> 
    </ItemGroup> 
    

    私は何を覚えていませんコンパイラ設定/ Zaは割り当てられますが、この図の目的には関係ありません。ポイントはです。を除外します。アイテムリストの属性には、特別な設定の対象となるファイルを除外して含める必要があります。あなたが見ているコンパイラ設定が最後のものであることに注意してください。

    +0

    これは.vcxprojファイルにありますか? – Xenial

    +0

    はい。これは普通の古いmsbuild構文です。これは、何が呼び出されても、古いmsbuildファイルで動作します。 –

    +0

    これはVSが使用/保存するフィルタに何らかの影響を与えますか?この変更を行って以来、私のファイルは必要に応じてコンパイルされますが、vcsproj.filtersファイルの保存は絶対に心を失いました。同様に、50行の重複を追加するたびに、ファイルを無意識に移動させるなどしています。私はMSBuildの新機能であるため、何が原因なのか分かりません。 – Xenial

    関連する問題