/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 キットのほとんどすべてのヘッダーファイルと互換性があります。これは、Windows フォール作成者 SDK (10.0.16299.0) から始まります。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. この動作をオーバーライドするには、コマンドラインで /permissive- の後に特定の /zcオプションを渡すことができます。You can pass specific /Zc options after /permissive- on the command line to override this behavior.

Visual Studio 2017 バージョン15.3 以降のバージョンのコンパイラでは、 /permissive- オプションに/zc: 三項オプションが設定されています。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.

すべてのバージョンの Visual Studio 2017 で、すべての C++ 11、C++ 14、または C++ 17 標準に準拠するコードが 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. /Permissive- オプションでは、Visual Studio のバージョンに応じて、2フェーズの名前参照のいくつかの側面に関する問題が検出されない場合があります。また、一時的な非 const 参照をバインドして、copy init as direct 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: ' operator? 'error C2593: 'operator ?' があいまいですis ambiguous

  • エラー C2679: binary '? ': 型 ' B ' の右側のオペランドを受け取る演算子が見つかりません (または変換できません)error C2679: binary '?': no operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

  • エラー C2678: binary '? ': 型 ' A ' の左辺オペランドを受け取る演算子が見つかりません (または変換できません)error C2678: binary '?': no operator found which takes a left-hand operand of type 'A' (or there is no acceptable conversion)

  • エラー C2446: ': ': ' B ' から ' A ' への変換がありません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で受け入れられ、 /zc: 三項または /permissive- が使用されている場合は、 /std: c++17で拒否されます。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);

場合によっては、型voidの引数を1つ持つ条件演算子にエラーが表示されることがあります。Another case where you may see errors is in conditional operators with one argument of type void. このケースは、ASSERT に似たマクロでよく見られます。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: 三項および /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

Windows フォール作成者更新 SDK (10.0.16299.0) または Windows Driver Kit (WDK) バージョン1709より前のバージョンの Windows キットでは、 /permissive- オプションが小さすぎます。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 4 月 2018 Update SDK (10.0.17134.0)、Windows フォール作成者更新 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.

Windows 4 月2018更新 SDK (10.0.17134.0) でリリースされたこれらの WinRT WRL ヘッダーは、 /permissive- ではクリーンではありません。These WinRT WRL headers released in the Windows April 2018 Update SDK (10.0.17134.0) are not clean with /permissive-. これらの問題を回避するには、 /permissive- を使用しないか、次のヘッダーを使用するときに /zc: twoPhase/permissive- を使用します。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 の問題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 4 月2018更新 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/チューンの問題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 の問題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 フォール作成者更新 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構造体は、ケース (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;
    };
    

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

  • Um/cellularapi_oem の問題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. この問題に対処するには、 /permissive- オプションを指定せずに cellularapi_oem を含むファイルをコンパイルするか、 /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 (' wchar_t * ' への typedef) への変換は非推奨とされますが、使用することはできません。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
    

    この問題に対処するには、 /permissive- オプションを指定せずに omscript. h を含むファイルをコンパイルするか、 /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. [構成プロパティ > ] [CC++/ > 言語] プロパティページを選択します。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

MSVC コンパイラオプションMSVC Compiler Options
MSVC コンパイラ コマンド ラインの構文MSVC Compiler Command-Line Syntax