/permissive -(標準への準拠)/permissive- (Standards conformance)

コンパイラに標準準拠のモードを指定します。Specify standards conformance mode to the compiler. 特定しより正確と移植性を向上させる、コードで準拠の問題を修正するためには、このオプションを使用します。Use this option to help you identify and fix conformance issues in your code, to make it both more correct and more portable.

構文Syntax

/permissive-/permissive-

RemarksRemarks

Visual Studio 2017 以降、このオプションはサポートされています。This option is supported in Visual Studio 2017 and later.

使用することができます、 /permissive - コンパイラ オプションは、標準準拠コンパイラの動作を指定します。You can use the /permissive- compiler option to specify standards-conforming compiler behavior. このオプションは、制限の緩やかな動作を無効にし、設定、 /Zc厳密に準拠コンパイラ オプション。This option disables permissive behaviors, and sets the /Zc compiler options for strict conformance. IDE では、このオプションも IntelliSense エンジン下線非準拠コードになります。In the IDE, this option also makes the IntelliSense engine underline non-conforming code.

既定で、 /permissive - Visual Studio 2017 バージョン 15.5 以降で作成された新しいプロジェクトのオプションを設定します。By default, the /permissive- option is set in new projects created by Visual Studio 2017 version 15.5 and later versions. 既定では以前のバージョンに設定されていません。It is not set by default in earlier versions. 前にいくつかの一般的なバグを含む、オプションの設定、コンパイラ診断のエラーが発生またはコードの非標準の言語で構築したときに警告が検出された、ときに、c++ 11 コード。When the option is set, the compiler generates diagnostic errors or warnings when non-standard language constructs are detected in your code, including some common bugs in pre-C++11 code.

/Permissive - オプションは、ほぼすべてのソフトウェア開発キット (SDK) や Windows Driver Kit (WDK)、Windows Fall Creators SDK (10.0.16299.0) 以降など、最新の Windows キットからヘッダー ファイルとの互換性。The /permissive- option is compatible with almost all of the header files from the latest Windows Kits, such as the Software Development Kit (SDK) or Windows Driver Kit (WDK), starting in the Windows Fall Creators SDK (10.0.16299.0). 以前のバージョンの SDK をコンパイルできない可能性があります /permissive - 各種のソース コードへの準拠の理由。Older versions of the SDK may fail to compile under /permissive- for various source code conformance reasons. コンパイラと別のリリースのタイムライン上の Sdk の出荷の残りの問題があるためです。The compiler and SDKs ship on different release timelines, therefore there are some remaining issues. 特定のヘッダー ファイルの問題を参照してください。 Windows ヘッダー問題以下。For specific header file issues, see Windows header issues below.

/Permissive - オプション セット、 /zc: referencebinding/Zc:strictStrings、および/Zc:rvalueCastに準拠するためのオプション動作です。The /permissive- option sets the /Zc:referenceBinding, /Zc:strictStrings, and /Zc:rvalueCast options to conforming behavior. これらのオプションでは、非準拠の動作の既定を値です。These options defaults to non-conforming behavior. 特定渡すことができます /Zc後オプション /permissive - でこの動作をオーバーライドするためのコマンドライン。You can pass specific /Zc options after /permissive- on the command line to override this behavior.

Visual Studio 2017 バージョン 15.3 では、コンパイラの最初のバージョンでは、 /permissive - オプション セット、 /Zc:ternaryオプション。In versions of the compiler beginning in Visual Studio 2017 version 15.3, the /permissive- option sets the /Zc:ternary option. コンパイラでは、2 フェーズの名前検索の要件の詳細も実装します。The compiler also implements more of the requirements for two-phase name look-up. ときに、 /permissive - オプションが設定されていると、コンパイラが関数とクラス テンプレートの定義を解析し、テンプレートで使用される依存と非依存の名前を識別します。When the /permissive- option is set, the compiler parses function and class template definitions, and identifies dependent and non-dependent names used in the templates. このリリースでは、名前の依存関係の分析だけが実行されます。In this release, only name dependency analysis is performed.

環境固有の拡張機能と、標準の実装に依存しますまま言語領域は受けません /permissive - します。Environment-specific extensions and language areas that the standard leaves up to the implementation are not affected by /permissive-. たとえば、Microsoft 固有__declspec、呼び出し規約、および構造化例外処理キーワード、および特定のコンパイラのプラグマ ディレクティブまたは属性はフラグが設定されないでコンパイラ /permissive - モード。For example, the Microsoft-specific __declspec, calling convention and structured exception handling keywords, and compiler-specific pragma directives or attributes are not flagged by the compiler in /permissive- mode.

/Permissive - オプション サポートを使用して、準拠コンパイラの現在のバージョンでどの言語コンストラクトが非準拠を確認します。The /permissive- option uses the conformance support in the current compiler version to determine which language constructs are non-conforming. オプションは、コードが特定のバージョンの C++ 標準に準拠しているかどうかを決定できません。The option does not determine if your code conforms to a specific version of the C++ standard. 最新のドラフト標準のすべての実装済みのコンパイラ サポートを有効にするには使用、 /std:latestオプション。To enable all implemented compiler support for the latest draft standard, use the /std:latest option. コンパイラのサポートを現在実装されている c++ 17 標準に制限する、 /std:c + + 17オプション。To restrict the compiler support to the currently implemented C++17 standard, use the /std:c++17 option. C++ 14 標準をより厳密に一致するように、コンパイラのサポートを制限するには、 /std:c + + + 14オプションは、既定値です。To restrict the compiler support to more closely match the C++14 standard, use the /std:c++14 option, which is the default.

すべての c++ 11、c++ 14、または c++ 17 標準に準拠しないコードが Visual Studio 2017 のすべてのバージョンの MSVC コンパイラによってサポートされています。Not all C++11, C++14, or C++17 standards-conforming code is supported by the MSVC compiler in all versions of Visual Studio 2017. Visual Studio のバージョンに応じて、 /permissive - オプションは、2 フェーズの名前参照の一部の側面に関する、一時的に非定数の参照をバインド、直接の初期化としてコピー init を扱うこと、許可の問題を検出しない可能性があります複数ユーザー定義の変換では、初期化、または別のトークンの論理演算子は、およびその他の適合性のサポートされていない領域。Depending on the version of Visual Studio, the /permissive- option may not detect issues regarding some aspects of two-phase name lookup, binding a non-const reference to a temporary, treating copy init as direct init, allowing multiple user-defined conversions in initialization, or alternative tokens for logical operators, and other non-supported conformance areas. Visual C++ の準拠に関する問題について詳しくは、「 Nonstandard Behavior」をご覧ください。For more information about conformance issues in Visual C++, see Nonstandard Behavior. 取得を最大限に活用する /permissive -、Visual Studio の最新バージョンに更新します。To get the most out of /permissive-, update Visual Studio to the latest version.

コードを修正する方法How to fix your code

いくつかの例として、非準拠を使用するときに検出されたコードの /permissive -、と共に、問題を修正する方法をお勧めします。Here are some examples of code that is detected as non-conforming when you use /permissive-, along with suggested ways to fix the issues.

ネイティブ コードの識別子として既定値の使用Use default as an identifier in native code

void func(int default); // Error C2321: 'default' is a keyword, and
                        // cannot be used in this context

依存ベース内のメンバーを検索します。Look up members in dependent base

template <typename T>
struct B {
    void f();
};

template <typename T>
struct D : public B<T> // B is a dependent base because its type
                       // depends on the type of T.
{
    // One possible fix is to uncomment the following line.
    // If this is a type, don't forget the 'typename' keyword.
    // using B<T>::f;

    void g() {
        f(); // error C3861: 'f': identifier not found
             // Another fix is to change it to 'this->f();'
    }
};

void h() {
    D<int> d;
    d.g();
}

メンバー宣言の修飾名の使用Use of qualified names in member declarations

struct A {
    void A::f() { } // error C4596: illegal qualified name in member
                    // declaration.
                    // Remove redundant 'A::' to fix.
};

メンバー初期化子内の複数の共用体のメンバーを初期化します。Initialize multiple union members in a member initializer

union U
{
    U()
        : i(1), j(1) // error C3442: Initializing multiple members of
                     // union: 'U::i' and 'U::j'.
                     // Remove all but one of the initializations to fix.
    {}
    int i;
    int j;
};

非表示のフレンド名のルックアップ規則Hidden friend name lookup rules

// Example 1
struct S {
    friend void f(S *);
};
// Uncomment this declaration to make the hidden friend visible:
// void f(S *); // This declaration makes the hidden friend visible

using type = void (*)(S *);
type p = &f; // error C2065: 'f': undeclared identifier.
// Example 2
struct S {
    friend void f(S *);
};
void g() {
    // Using nullptr instead of S prevents argument dependent lookup in S
    f(nullptr); // error C3861: 'f': identifier not found

    S *p = nullptr;
    f(S); // Hidden friend now found via argument-dependent lookup.
}

配列の範囲でスコープを持つ列挙型を使用します。Use scoped enums in array bounds

enum class Color {
    Red, Green, Blue
};

int data[Color::Blue]; // error C3411: 'Color' is not valid as the size
                       // of an array as it is not an integer type.
                       // Cast to type size_t or int to fix.

ネイティブ コードでは for each の使用Use for each in native code

void func() {
    int array[] = {1, 2, 30, 40};
    for each (int i in array) // error C4496: nonstandard extension
                              // 'for each' used: replace with
                              // ranged-for statement:
                              // for (int i: array)
    {
        // ...
    }
}

ATL 属性の使用Use of ATL Attributes

// Example 1
[uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")]
class A {};
// Fix for example 1
class __declspec(uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")) B {};
// Example 2
[emitidl];
[module(name="Foo")];

[object, local, uuid("9e66a290-4365-11d2-a997-00c04fa37ddb")]
__interface ICustom {
    HRESULT Custom([in] longl, [out, retval] long*pLong);
    [local] HRESULT CustomLocal([in] longl, [out, retval] long*pLong);
};

[coclass, appobject, uuid("9e66a294-4365-11d2-a997-00c04fa37ddb")]
class CFoo : public ICustom
{};
// Fix for example 2
// First, create the *.idl file. The vc140.idl generated file can be
// used to automatically obtain a *.idl file for the interfaces with
// annotation. Second, add a midl step to your build system to make
// sure that the C++ interface definitions are outputted.
// Last, adjust your existing code to use ATL directly as shown in
// the atl implementation section.

-- IDL  FILE--
import "docobj.idl";

[object, local, uuid(9e66a290-4365-11d2-a997-00c04fa37ddb)]
interface ICustom : IUnknown {
    HRESULT Custom([in] longl, [out,retval] long*pLong);
    [local] HRESULT CustomLocal([in] longl, [out,retval] long*pLong);
};

[ version(1.0), uuid(29079a2c-5f3f-3325-99a1-3ec9c40988bb) ]
library Foo {
    importlib("stdole2.tlb");
    importlib("olepro32.dll");

    [version(1.0), appobject, uuid(9e66a294-4365-11d2-a997-00c04fa37ddb)]
    coclass CFoo { interface ICustom; };
}

-- ATL IMPLEMENTATION--
#include <idl.header.h>
#include <atlbase.h>

class ATL_NO_VTABLE CFooImpl : public ICustom,
    public ATL::CComObjectRootEx<CComMultiThreadModel>
{
    public:BEGIN_COM_MAP(CFooImpl)
    COM_INTERFACE_ENTRY(ICustom)
    END_COM_MAP()
};

あいまいな条件演算子の引数Ambiguous conditional operator arguments

Visual Studio 2017 バージョン 15.3 の前に、コンパイラのバージョンでは、コンパイラは条件演算子 (または三項演算子) の引数を受け入れられる?:標準によってあいまいなが検討されます。In versions of the compiler before Visual Studio 2017 version 15.3, the compiler accepted arguments to the conditional operator (or ternary operator) ?: that are considered ambiguous by the Standard. /Permissive - モードでは、コンパイラはこれで以前のバージョンでの診断を使用せずにコンパイルする場合、1 つまたは複数の診断発行します。In /permissive- mode, the compiler now issues one or more diagnostics in cases that compiled without diagnostics in earlier versions.

この変更の可能性のある一般的なエラーは次のとおりです。Common errors that may result from this change include:

  • エラー C2593: '演算子?'error C2593: 'operator ?' あいまいです。is ambiguous

  • エラー C2679: バイナリ '?': 'B' 型の右辺のオペランドを扱う演算子が見つかりません (または、変換はありません)error C2679: binary '?': no operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

  • エラー C2678: バイナリ '?': 型 'A' の左側のオペランドを扱う演算子が見つかりません (または、変換はありません)error C2678: binary '?': no operator found which takes a left-hand operand of type 'A' (or there is no acceptable conversion)

  • エラー C2446: ':': 'a' から 'B' 変換なしerror C2446: ':': no conversion from 'B' to 'A'

この問題を引き起こす可能性のある一般的なコード パターンがいくつかのクラス C 型 T を別の型 T から非明示的コンス トラクターと非明示的変換演算子の両方を提供するときにします。この場合、2 番目の引数の 3 番目の引数の型への変換と 3 番目の引数の 2 番目の引数の型への変換の両方で有効な変換とは。A typical code pattern that can cause this issue is when some class C provides both a non-explicit constructor from another type T and a non-explicit conversion operator to type T. In this case, both the conversion of the second argument to the type of the third argument, and the conversion of the third argument to the type of the second argument, are valid conversions. 両方が有効であるために、標準に従ってがあいまいですが。Since both are valid, it's ambiguous according to the standard.

// Example 1: class that provides conversion to and initialization from some type T
struct A
{
    A(int);
    operator int() const;
};

extern bool cond;

A a(42);
// Accepted when /Zc:ternary or /permissive- is not used:
auto x = cond ? 7 : a; // A: permissive behavior prefers A(7) over (int)a
// Accepted always:
auto y = cond ? 7 : int(a);
auto z = cond ? A(7) : a;

T が null で終わる文字列型のいずれかを表す場合にこの共通パターンに重要な例外がある (たとえば、 const char *const char16_t *など) と実際の引数を?:文字列は、対応する型のリテラル。There is an important exception to this common pattern when T represents one of the null-terminated string types (for example, const char *, const char16_t *, and so on) and the actual argument to ?: is a string literal of corresponding type. C++ 17 には、c++ 14 のセマンティクスが変更されました。C++17 has changed semantics from C++14. 例 2 のコードが受け入れられるため、 /std:c + + + 14および 拒否された /std:c + + + 17とき /Zc:ternaryまたは /permissive- 使用されます。As a result, the code in example 2 is accepted under /std:c++14 and rejected under /std:c++17 when /Zc:ternary or /permissive- is used.

// Example 2: exception from the above
struct MyString
{
    MyString(const char* s = "") noexcept;  // from char*
    operator const char* () const noexcept; //   to char*
};

extern bool cond;

MyString s;
// Using /std:c++14, /permissive- or /Zc:ternary behavior
// is to prefer MyString("A") over (const char*)s
// but under /std:c++17 this line causes error C2445:
auto x = cond ? "A" : s;
// You can use a static_cast to resolve the ambiguity:
auto y = cond ? "A" : static_cast<const char*>(s);

別のケースでエラーが発生する可能性がありますが、型の引数の 1 つの条件演算子voidします。Another case where you may see errors is in conditional operators with one argument of type void. この場合は、アサートに似たマクロで一般的な可能性があります。This case may be common in ASSERT-like macros.

// Example 3: void arguments
void myassert(const char* text, const char* file, int line);
// Accepted when /Zc:ternary or /permissive- is not used:
#define ASSERT_A(ex) (void)((ex) ? 1 : myassert(#ex, __FILE__, __LINE__))
// Accepted always:
#define ASSERT_B(ex) (void)((ex) ? void() : myassert(#ex, __FILE__, __LINE__))

条件演算子の結果の型の下で変更可能性がありますが、メタプログラミング テンプレートでエラーが発生する可能性がありますも /Zc:ternary/permissive - します。You may also see errors in template metaprogramming, where conditional operator result types may change under /Zc:ternary and /permissive-. 使用して、この問題を解決する方法の 1 つstd::remove_reference結果の型にします。One way to resolve this issue is to use std::remove_reference on the resulting type.

// Example 4: different result types
extern bool cond;
extern int count;
char  a = 'A';
const char  b = 'B';
decltype(auto) x = cond ? a : b; // char without, const char& with /Zc:ternary
const char (&z)[2] = count > 3 ? "A" : "B"; // const char* without /Zc:ternary

2 フェーズの名前の検索Two-phase name look-up

ときに、 /permissive - オプションが設定されている、コンパイラは、2 フェーズの名前検索の必要に応じてテンプレートで使用される依存と非依存の名前を識別する、関数とクラス テンプレート定義を解析します。When the /permissive- option is set, the compiler parses function and class template definitions, identifying dependent and non-dependent names used in templates as required for two-phase name look-up. Visual Studio 2017 バージョン 15.3 では、名前の依存関係の分析が実行されます。In Visual Studio 2017 version 15.3, name dependency analysis is performed. 具体的には、テンプレート定義のコンテキストで宣言されていない非依存名では、ISO C 標準で必要な診断メッセージが発生します。In particular, non-dependent names that are not declared in the context of a template definition cause a diagnostic message as required by the ISO C++ standards. Visual Studio 2017 バージョン 15.7 では、定義のコンテキストでの引数依存の参照を必要とする非依存名のバインドも行われます。In Visual Studio 2017 version 15.7, binding of non-dependent names that require argument-dependent look-up in the definition context is also done.

// dependent base
struct B {
    void g() {}
};

template<typename T>
struct D : T {
    void f() {
        // The call to g was incorrectly allowed in VS2017:
        g();  // Now under /permissive-: C3861
        // Possible fixes:
        // this->g();
        // T::g();
    }
};

int main()
{
    D<B> d;
    d.f();
}

2 フェーズ参照は、従来の動作をしますが、それ以外の場合に必要なかどうか /permissive - の動作を追加、 /Zc:twoPhase- オプション。If you want legacy behavior for two-phase lookup, but otherwise want /permissive- behavior, add the /Zc:twoPhase- option.

Windows ヘッダーの問題Windows header issues

/Permissive - オプションは、Windows Fall Creators Update SDK (10.0.16299.0) する前に Windows キットのバージョン、または Windows Driver Kit (WDK) バージョン 1709 の厳しすぎます。The /permissive- option is too strict for versions of the Windows Kits before Windows Fall Creators Update SDK (10.0.16299.0), or the Windows Driver Kit (WDK) version 1709. 使用するには、Windows キットの最新バージョンに更新することをお勧めします。 /permissive - Windows またはデバイスのドライバー コードにします。We recommend you update to the latest versions of the Windows Kits in order to use /permissive- in your Windows or device driver code.

Windows April 2018 Update SDK (10.0.17134.0)、Windows Fall Creators Update SDK (10.0.16299.0) または Windows Driver Kit (WDK) 1709 で特定のヘッダー ファイルの使用を互換性の問題がある /permissive-.Certain header files in the Windows April 2018 Update SDK (10.0.17134.0), the Windows Fall Creators Update SDK (10.0.16299.0), or the Windows Driver Kit (WDK) 1709, still have issues that make them incompatible with use of /permissive-. これらの問題を回避するをお勧めをそれらを必要とし、削除するソース コード ファイルのみにこれらのヘッダーの使用を制限する、 /permissive - それらの特定のソース コード ファイルをコンパイルするときのオプションします。To work around these issues, we recommend you restrict the use of these headers to only those source code files that require them, and remove the /permissive- option when you compile those specific source code files.

これらの WinRT WRL ヘッダーがリリースされた、Windows April 2018 Update SDK (10.0.17134.0) のないでクリーン /permissive - します。These WinRT WRL headers released in the Windows April 2018 Update SDK (10.0.17134.0) are not clean with /permissive-. これらの問題を回避するには、いずれかには、使わない /permissive -、使用または /permissive -/Zc:twoPhase- これらのヘッダーを使用する場合。To work around these issues, either do not use /permissive-, or use /permissive- with /Zc:twoPhase- when working with these headers:

  • Winrt/wrl/async.h の問題Issues in winrt/wrl/async.h

    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\async.h(483): error C3861: 'TraceDelegateAssigned': identifier not found
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\async.h(491): error C3861: 'CheckValidStateForDelegateCall': identifier not found
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\async.h(509): error C3861: 'TraceProgressNotificationStart': identifier not found
    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\async.h(513): error C3861: 'TraceProgressNotificationComplete': identifier not found
    
  • Winrt/wrl/implements.h を発行します。Issue in winrt/wrl/implements.h

    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\winrt\wrl\implements.h(2086): error C2039: 'SetStrongReference': is not a member of 'Microsoft::WRL::Details::WeakReferenceImpl'
    

これらのユーザー モード ヘッダーがリリースされた、Windows April 2018 Update SDK (10.0.17134.0) のないでクリーン /permissive - します。These User Mode headers released in the Windows April 2018 Update SDK (10.0.17134.0) are not clean with /permissive-. これらの問題を回避するを使用しないで /permissive - これらのヘッダーを使用する場合。To work around these issues, do not use /permissive- when working with these headers:

  • Um/Tune.h の問題Issues in um/Tune.h

    C:\ProgramFiles(x86)\Windows Kits\10\include\10.0.17134.0\um\tune.h(139): error C3861: 'Release': identifier not found
    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\tune.h(559): error C3861: 'Release': identifier not found
    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\tune.h(1240): error C3861: 'Release': identifier not found
    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\tune.h(1240): note: 'Release': function declaration must be available as none of the arguments depend on a template parameter
    
  • Um/spddkhlp.h を発行します。Issue in um/spddkhlp.h

    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\spddkhlp.h(759): error C3861: 'pNode': identifier not found
    
  • Um/refptrco.h の問題Issues in um/refptrco.h

    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\refptrco.h(179): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\refptrco.h(342): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
    C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\um\refptrco.h(395): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
    

これらの問題は、Windows Fall Creators Update SDK (10.0.16299.0) のヘッダーをユーザー モードに固有します。These issues are specific to User Mode headers in the Windows Fall Creators Update SDK (10.0.16299.0):

  • Um/Query.h を発行します。Issue in um/Query.h

    使用する場合、 /permissive - コンパイラ スイッチ、 tagRESTRICTION case(RTOr) メンバーによりコンパイルしない構造体 'または'。When using the /permissive- compiler switch, the tagRESTRICTION structure does not compile due to the case(RTOr) member 'or'.

    struct tagRESTRICTION
    {
         ULONG rt;
         ULONG weight;
         /* [switch_is][switch_type] */ union _URes
         {
             /* [case()] */ NODERESTRICTION ar;
             /* [case()] */ NODERESTRICTION or;  // error C2059: syntax error: '||'
             /* [case()] */ NODERESTRICTION pxr;
             /* [case()] */ VECTORRESTRICTION vr;
             /* [case()] */ NOTRESTRICTION nr;
             /* [case()] */ CONTENTRESTRICTION cr;
             /* [case()] */ NATLANGUAGERESTRICTION nlr;
             /* [case()] */ PROPERTYRESTRICTION pr;
             /* [default] */  /* Empty union arm */
         } res;
    };
    

    この問題に対処せず Query.h を含むファイルをコンパイル、 /permissive - オプション。To address this issue, compile files that include Query.h without the /permissive- option.

  • Um/cellularapi_oem.h を発行します。Issue in um/cellularapi_oem.h

    使用する場合、 /permissive - コンパイラ スイッチの事前宣言enum UICCDATASTOREACCESSMODE警告が発生します。When using the /permissive- compiler switch, the forward declaration of enum UICCDATASTOREACCESSMODE causes a warning:

    typedef enum UICCDATASTOREACCESSMODE UICCDATASTOREACCESSMODE; // C4471
    

    スコープを持たない列挙型の事前宣言は、Microsoft 拡張です。The forward declaration of unscoped enum is a Microsoft extension. この問題に対処せず cellularapi_oem.h を含むファイルをコンパイル、 /permissive - オプション、またはを使用して、 /wd警告 C4471 をミュートするオプション。To address this issue, compile files that include cellularapi_oem.h without the /permissive- option, or use the /wd option to silence warning C4471.

  • Um/omscript.h を発行します。Issue in um/omscript.h

    C++ 03、文字列リテラルから BSTR への変換で (typedef でにある ' wchar_t *') は非推奨とされますが、許可されています。In C++03, a conversion from a string literal to BSTR (which is a typedef to 'wchar_t *') is deprecated but allowed. C++ 11 では、変換は使用できなくします。In C++11, the conversion is no longer allowed.

    virtual /* [id] */ HRESULT STDMETHODCALLTYPE setExpression(
         /* [in] */ __RPC__in BSTR propname,
         /* [in] */ __RPC__in BSTR expression,
         /* [in][defaultvalue] */ __RPC__in BSTR language = L"") = 0; // C2440
    

    この問題に対処せず omscript.h を含むファイルをコンパイル、 /permissive - オプション、またはを使用して、 /Zc:strictStrings- 代わりにします。To address this issue, compile files that include omscript.h without the /permissive- option, or use /Zc:strictStrings- instead.

Visual Studio 開発環境において、このコンパイラ オプションを設定する方法To set this compiler option in the Visual Studio development environment

Visual Studio 2017 バージョン 15.5 以降では、この手順を使用します。In Visual Studio 2017 version 15.5 and later versions, use this procedure:

  1. プロジェクトの開くプロパティ ページ ダイアログ ボックス。Open your project's Property Pages dialog box.

  2. 選択、構成プロパティ > C/C++ > 言語プロパティ ページ。Select the Configuration Properties > C/C++ > Language property page.

  3. 変更、準拠モードプロパティの値を [はい] (/permissive -) します。Change the Conformance mode property value to Yes (/permissive-). 選択OKまたは適用変更を保存します。Choose OK or Apply to save your changes.

Visual Studio 2017 バージョン 15.5 より前に、のバージョンでは、この手順を使用します。In versions before Visual Studio 2017 version 15.5, use this procedure:

  1. プロジェクトの開くプロパティ ページ ダイアログ ボックス。Open your project's Property Pages dialog box.

  2. 選択、構成プロパティ > C/C++ > コマンドラインプロパティ ページ。Select the Configuration Properties > C/C++ > Command Line property page.

  3. 入力、 /permissive - コンパイラ オプションで、追加オプションボックス。Enter the /permissive- compiler option in the Additional Options box. 選択OKまたは適用変更を保存します。Choose OK or Apply to save your changes.

このコンパイラ オプションをコードから設定するにはTo set this compiler option programmatically

関連項目See also