/permissive- (Übereinstimmung mit Standards)/permissive- (Standards conformance)

Geben Sie dem Compiler den Standardkonformitätsmodus an.Specify standards conformance mode to the compiler. Verwenden Sie diese Option, um Konformitätsprobleme im Code zu identifizieren und zu beheben, um sie sowohl korrekter als auch tragbarer zu gestalten.Use this option to help you identify and fix conformance issues in your code, to make it both more correct and more portable.

SyntaxSyntax

/permissive-/permissive-

BemerkungenRemarks

Diese Option wird in Visual Studio 2017 und höher unterstützt.This option is supported in Visual Studio 2017 and later.

Sie können die Option /permissive- compiler verwenden, um das standardkonforme Compilerverhalten anzugeben.You can use the /permissive- compiler option to specify standards-conforming compiler behavior. Diese Option deaktiviert freizügiges Verhalten und legt die /Zc-Compileroptionen für die strikte Konformität fest.This option disables permissive behaviors, and sets the /Zc compiler options for strict conformance. In der IDE wird durch diese Option auch der IntelliSense-Modul dazu verwendet, nicht konformen Code zu unterstreichen.In the IDE, this option also makes the IntelliSense engine underline non-conforming code.

Standardmäßig wird die Option /permissive- in neuen Projekten festgelegt, die von Visual Studio 2017 Version 15.5 und höher erstellt wurden.By default, the /permissive- option is set in new projects created by Visual Studio 2017 version 15.5 and later versions. In früheren Versionen ist es nicht standardmäßig festgelegt.It's not set by default in earlier versions. Wenn die Option festgelegt ist, generiert der Compiler Diagnosefehler oder Warnungen, wenn nicht standardmäßige Sprachkonstrukte im Code erkannt werden, einschließlich einiger häufiger Fehler im Code vor 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.

Die Option /permissive- ist mit fast allen Headerdateien der neuesten Windows Kits kompatibel, z. B. dem Software Development Kit (SDK) oder dem Windows Driver Kit (WDK), beginnend im Windows Fall Creators 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). Ältere Versionen des SDK können aus verschiedenen Gründen der Quellcodeübereinstimmung unter /permissive nicht kompiliert werden.Older versions of the SDK may fail to compile under /permissive- for various source code conformance reasons. Der Compiler und SDKs werden auf verschiedenen Release-Timelines ausgeliefert, daher gibt es noch einige Probleme.The compiler and SDKs ship on different release timelines, therefore there are some remaining issues. Informationen zu bestimmten Headerdateiproblemen finden Sie unter Windows-Headerprobleme unten.For specific header file issues, see Windows header issues below.

Die Option /permissive- legt die Optionen /Zc:referenceBinding, /Zc:strictStringsund /Zc:rvalueCast auf konformes Verhalten fest.The /permissive- option sets the /Zc:referenceBinding, /Zc:strictStrings, and /Zc:rvalueCast options to conforming behavior. Diese Optionen sind standardmäßig nicht konformes Verhalten.These options defaults to non-conforming behavior. Sie können bestimmte /Zc-Optionen nach /permissive- in der Befehlszeile übergeben, um dieses Verhalten zu überschreiben.You can pass specific /Zc options after /permissive- on the command line to override this behavior.

In Versionen des Compilers ab Visual Studio 2017 Version 15.3 legt die Option /permissive- die Option /Zc:ternary fest.In versions of the compiler beginning in Visual Studio 2017 version 15.3, the /permissive- option sets the /Zc:ternary option. Der Compiler implementiert auch mehr Anforderungen für die zweiphasige Namenssuche.The compiler also implements more of the requirements for two-phase name look-up. Wenn die Option /permissive- festgelegt ist, analysiert der Compiler Funktions- und Klassenvorlagendefinitionen und identifiziert abhängige und nicht abhängige Namen, die in den Vorlagen verwendet werden.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 dieser Version wird nur eine Namensabhängigkeitsanalyse durchgeführt.In this release, only name dependency analysis is performed.

Umweltspezifische Erweiterungen und Sprachbereiche, die der Standard bis zur Implementierung überlässt, sind von /permissive- nicht betroffen.Environment-specific extensions and language areas that the standard leaves up to the implementation are not affected by /permissive-. Beispielsweise werden die Microsoft-spezifische __declspec, Aufrufkonvention und strukturierte Ausnahmebehandlungsschlüsselwörter sowie Compilerspezifische Pragma-Direktiven oder Attribute vom Compiler nicht im /permissive-Modus gekennzeichnet.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.

Die Option /permissive- verwendet die Konformitätsunterstützung in der aktuellen Compilerversion, um zu bestimmen, welche Sprachkonstrukte nicht konform sind.The /permissive- option uses the conformance support in the current compiler version to determine which language constructs are non-conforming. Die Option bestimmt nicht, ob ihr Code einer bestimmten Version des C++-Standards entspricht.The option doesn't determine if your code conforms to a specific version of the C++ standard. Um die gesamte implementierte Compilerunterstützung für den neuesten Entwurfsstandard zu aktivieren, verwenden Sie die Option /std:latest.To enable all implemented compiler support for the latest draft standard, use the /std:latest option. Um die Compilerunterstützung auf den aktuell implementierten C++17-Standard zu beschränken, verwenden Sie die Option /std:c++17.To restrict the compiler support to the currently implemented C++17 standard, use the /std:c++17 option. Um die Compilerunterstützung auf eine engere Übereinstimmung mit dem C++14-Standard zu beschränken, verwenden Sie die Option /std:c++14, die die Standardeinstellung ist.To restrict the compiler support to more closely match the C++14 standard, use the /std:c++14 option, which is the default.

Nicht der gesamte C++11-, C++14- oder C++17-Standardcode wird vom MSVC-Compiler in allen Versionen von Visual Studio 2017 unterstützt.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. Abhängig von der Version von Visual Studio erkennt die Option /permissive- möglicherweise keine Probleme in Bezug auf einige Aspekte der zweiphasigen Namenssuche, indem ein nicht-const-Verweis auf einen temporären Verweis gebunden wird, das Kopieren init als direktes Init behandelt, mehrere benutzerdefinierte Konvertierungen in der Initialisierung oder alternative Token für logische Operatoren und andere nicht unterstützte Konformitätsbereiche ermöglicht.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. Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nonstandard Behavior.For more information about conformance issues in Visual C++, see Nonstandard Behavior. Um das Beste aus /permissive- herausholen, aktualisieren Sie Visual Studio auf die neueste Version.To get the most out of /permissive-, update Visual Studio to the latest version.

So beheben Sie Ihren CodeHow to fix your code

Hier sind einige Beispiele für Code, der als nicht konform erkannt wird, wenn Sie /permissive- verwenden, zusammen mit vorgeschlagenen Möglichkeiten, die Probleme zu beheben.Here are some examples of code that is detected as non-conforming when you use /permissive-, along with suggested ways to fix the issues.

Verwenden der Standardeinstellung als Bezeichner im systemeigenen CodeUse default as an identifier in native code

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

Nachschlagen von Mitgliedern in abhängiger BasisLook 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();
}

Verwendung qualifizierter Namen in MitgliedserklärungenUse of qualified names in member declarations

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

Initialisieren mehrerer Gewerkschaftsmitglieder in einem MemberinitialisiererInitialize 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;
};

Regeln für die Suche nach namen verborgenen FreundenHidden 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(p); // Hidden friend now found via argument-dependent lookup.
}

Verwenden von bereichsgebundenen Enumerungen in ArraygrenzenUse 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.

Verwendung für jeden in systemeigenem CodeUse 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)
    {
        // ...
    }
}

Verwendung von ATL-AttributenUse 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()
};

Mehrdeutige bedingte OperatorargumenteAmbiguous conditional operator arguments

In Versionen des Compilers vor Visual Studio 2017 Version 15.3 akzeptierte der ?: Compiler Argumente an den bedingten Operator (oder ternären Operator), die vom Standard als mehrdeutig betrachtet werden.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. Im /permissive-Modus gibt der Compiler jetzt eine oder mehrere Diagnosen aus, wenn in früheren Versionen ohne Diagnose kompiliert wurde.In /permissive- mode, the compiler now issues one or more diagnostics in cases that compiled without diagnostics in earlier versions.

Häufige Fehler, die sich aus dieser Änderung ergeben können, sind:Common errors that may result from this change include:

  • Fehler C2593: 'Operator ?'error C2593: 'operator ?' ist mehrdeutigis ambiguous

  • Fehler C2679: binär '?': Es wurde kein Operator gefunden, der einen rechten Operanden vom Typ 'B' annimmt (oder es gibt keine akzeptable Konvertierung)error C2679: binary '?': no operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

  • Fehler C2678: binär '?': kein Operator gefunden, der einen linken Operanden vom Typ 'A' nimmt (oder es gibt keine akzeptable Konvertierung)error C2678: binary '?': no operator found which takes a left-hand operand of type 'A' (or there is no acceptable conversion)

  • Fehler C2446: ':': keine Konvertierung von 'B' in 'A'error C2446: ':': no conversion from 'B' to 'A'

Ein typisches Codemuster, das dieses Problem verursachen kann, ist, wenn eine Klasse C sowohl einen nicht expliziten Konstruktor eines anderen Typs T als auch einen nicht expliziten Konvertierungsoperator für Typ T bereitstellt. Im vorliegenden Fall sind sowohl die Konvertierung des zweiten Arguments in den Typ des dritten Arguments als auch die Konvertierung des dritten Arguments in den Typ des zweiten Arguments gültige Konvertierungen.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. Da beide gültig sind, ist sie gemäß dem Standard mehrdeutig.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;

Es gibt eine wichtige Ausnahme von diesem allgemeinen Muster, wenn T einen der const char * const char16_t *null-terminierten Zeichenfolgentypen (z. B. , , usw.) darstellt und das eigentliche Argument für ?: ein Zeichenfolgenliteral des entsprechenden Typs ist.There's 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 hat die Semantik von C++14 geändert.C++17 has changed semantics from C++14. Daher wird der Code in Beispiel 2 unter /std:c++14 akzeptiert und unter /std:c++17 abgelehnt, wenn /Zc:ternary oder /permissive- verwendet wird.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);

Ein weiterer Fall, in dem Fehler angezeigt werden, ist in bedingten Operatoren mit einem Argument vom Typ void.Another case where you may see errors is in conditional operators with one argument of type void. Dieser Fall kann in ASSERT-ähnlichen Makros üblich sein.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__))

Möglicherweise werden auch Fehler in der Vorlagenmetaprogrammierung angezeigt, bei denen sich die Ergebnistypen des bedingten Operators unter /Zc:ternary und /permissive- ändern können.You may also see errors in template metaprogramming, where conditional operator result types may change under /Zc:ternary and /permissive-. Eine Möglichkeit, dieses Problem zu beheben, besteht darin, std::remove_reference für den resultierenden Typ zu verwenden.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

Zwei-Phasen-NamenssucheTwo-phase name look-up

Wenn die Option /permissive- festgelegt ist, analysiert der Compiler Funktions- und Klassenvorlagendefinitionen und identifiziert abhängige und nicht abhängige Namen, die in Vorlagen verwendet werden, wie es für die zweiphasige Namenssuche erforderlich ist.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. In Visual Studio 2017 Version 15.3 wird eine Namensabhängigkeitsanalyse durchgeführt.In Visual Studio 2017 version 15.3, name dependency analysis is performed. Insbesondere nicht abhängige Namen, die nicht im Kontext einer Vorlagendefinition deklariert werden, verursachen eine Diagnosemeldung, wie dies von den ISO C++-Standards gefordert wird.In particular, non-dependent names that aren't declared in the context of a template definition cause a diagnostic message as required by the ISO C++ standards. In Visual Studio 2017 Version 15.7 wird auch die Bindung nicht abhängiger Namen durchgeführt, die eine argumentabhängige Suche im Definitionskontext erfordern.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();
}

Wenn Sie ein Legacyverhalten für die zweiphasige Suche wünschen, ansonsten aber /permissive- Verhalten wünschen, fügen Sie die Option /Zc:twoPhase- hinzu.If you want legacy behavior for two-phase lookup, but otherwise want /permissive- behavior, add the /Zc:twoPhase- option.

Probleme mit dem Windows-HeaderWindows header issues

Die Option /permissive- ist zu streng für Versionen der Windows Kits vor Windows Fall Creators Update SDK (10.0.16299.0) oder dem Windows Driver Kit (WDK) Version 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. Wir empfehlen Ihnen, auf die neuesten Versionen der Windows-Kits zu aktualisieren, um /permissive- in Ihrem Windows- oder Gerätetreibercode zu verwenden.We recommend you update to the latest versions of the Windows Kits in order to use /permissive- in your Windows or device driver code.

Bestimmte Headerdateien im Windows April 2018 Update SDK (10.0.17134.0), dem Windows Fall Creators Update SDK (10.0.16299.0) oder dem Windows Driver Kit (WDK) 1709 haben immer noch Probleme, die sie mit der Verwendung von /permissive- unvereinbar machen.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-. Um diese Probleme zu umgehen, empfehlen wir, dass Sie die Verwendung dieser Header auf die Quellcodedateien beschränken, die sie benötigen, und die Option /permissive- entfernen, wenn Sie diese spezifischen Quellcodedateien kompilieren.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.

Diese WinRT WRL-Header, die im Windows April 2018 Update SDK (10.0.17134.0) veröffentlicht wurden, sind nicht mit /permissive- bereinigt.These WinRT WRL headers released in the Windows April 2018 Update SDK (10.0.17134.0) aren't clean with /permissive-. Um diese Probleme zu umgehen, verwenden Sie entweder nicht /permissive-, oder verwenden Sie /permissive- mit /Zc:twoPhase- wenn Sie mit diesen Headern arbeiten:To work around these issues, either do not use /permissive-, or use /permissive- with /Zc:twoPhase- when you work with these headers:

  • Probleme in winrt/wrl/async.hIssues 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
    
  • Problem in winrt/wrl/implements.hIssue 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'
    

Diese Benutzermodus-Header, die im Windows April 2018 Update SDK (10.0.17134.0) veröffentlicht wurden, sind nicht mit /permissive- bereinigt.These User Mode headers released in the Windows April 2018 Update SDK (10.0.17134.0) aren't clean with /permissive-. Um diese Probleme zu umgehen, verwenden Sie /permissive- nicht, wenn Sie mit diesen Headern arbeiten:To work around these issues, don't use /permissive- when working with these headers:

  • Probleme in um/Tune.hIssues 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
    
  • Ausgabe in um/spddkhlp.hIssue 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
    
  • Probleme in um/refptrco.hIssues 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'
    

Diese Probleme sind spezifisch für Benutzermodusheader im 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):

  • Problem in um/Query.hIssue in um/Query.h

    Bei Verwendung des /permissive- tagRESTRICTION Compiler-Switches wird die Struktur aufgrund des case(RTOr)-Members 'oder' nicht kompiliert.When using the /permissive- compiler switch, the tagRESTRICTION structure doesn't compile because of 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;
    };
    

    Um dieses Problem zu beheben, kompilieren Sie Dateien, die Query.h enthalten, ohne die Option /permissive-.To address this issue, compile files that include Query.h without the /permissive- option.

  • Ausgabe in um/cellularapi_oem.hIssue in um/cellularapi_oem.h

    Bei Verwendung des /permissive- Compiler-Schalters enum UICCDATASTOREACCESSMODE verursacht die Vorwärtsdeklaration eine Warnung:When using the /permissive- compiler switch, the forward declaration of enum UICCDATASTOREACCESSMODE causes a warning:

    typedef enum UICCDATASTOREACCESSMODE UICCDATASTOREACCESSMODE; // C4471
    

    Die Vorwärtsdeklaration der nicht scoped enum ist eine Microsoft-Erweiterung.The forward declaration of unscoped enum is a Microsoft extension. Um dieses Problem zu beheben, kompilieren Sie Dateien, die cellularapi_oem.h ohne die Option /permissive- enthalten, oder verwenden Sie die Option /wd, um die Warnung C4471 zum Schweigen zu bringen.To address this issue, compile files that include cellularapi_oem.h without the /permissive- option, or use the /wd option to silence warning C4471.

  • Problem in um/omscript.hIssue in um/omscript.h

    In C++03 ist eine Konvertierung von einem Zeichenfolgenliteral in BSTR (das ist ein typedef in 'wchar_t *') veraltet, aber zulässig.In C++03, a conversion from a string literal to BSTR (which is a typedef to 'wchar_t *') is deprecated but allowed. In C++11 ist die Konvertierung nicht mehr zulässig.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
    

    Um dieses Problem zu beheben, kompilieren Sie Dateien, die omscript.h enthalten, ohne die Option /permissive- oder verwenden Sie stattdessen /Zc:strictStrings-.To address this issue, compile files that include omscript.h without the /permissive- option, or use /Zc:strictStrings- instead.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung festTo set this compiler option in the Visual Studio development environment

Verwenden Sie in Visual Studio 2017 Version 15.5 und höher wie folgt:In Visual Studio 2017 version 15.5 and later versions, use this procedure:

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten Ihres Projekts.Open your project's Property Pages dialog box.

  2. Wählen Sie die Eigenschaftenseite "Konfigurationseigenschaften > C/C++ > Language" aus.Select the Configuration Properties > C/C++ > Language property page.

  3. Ändern Sie den Eigenschaftswert des Konformitätsmodus in Ja (/permissive-).Change the Conformance mode property value to Yes (/permissive-). Wählen Sie OK oder Übernehmen, um Ihre Änderungen zu speichern.Choose OK or Apply to save your changes.

Verwenden Sie in Versionen vor Visual Studio 2017 Version 15.5 dieses Verfahren:In versions before Visual Studio 2017 version 15.5, use this procedure:

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten Ihres Projekts.Open your project's Property Pages dialog box.

  2. Wählen Sie die Eigenschaftenseite "Konfigurationseigenschaften > C/C++ > Befehlszeile" aus.Select the Configuration Properties > C/C++ > Command Line property page.

  3. Geben Sie die Option /permissive- compiler in das Feld Zusätzliche Optionen ein.Enter the /permissive- compiler option in the Additional Options box. Wählen Sie OK oder Übernehmen, um Ihre Änderungen zu speichern.Choose OK or Apply to save your changes.

So legen Sie diese Compileroption programmgesteuert festTo set this compiler option programmatically

Siehe auchSee also

MSVC-CompileroptionenMSVC Compiler Options
Syntax für die MSVC-CompilerbefehlszeileMSVC Compiler Command-Line Syntax