/ permissive-(zgodność ze standardami)/permissive- (Standards conformance)

Określ tryb zgodności standardów do kompilatora.Specify standards conformance mode to the compiler. Użyj tej opcji, aby ułatwić identyfikowanie i rozwiązywanie problemów ze zgodnością w kodzie, aby stał się bardziej poprawny i bardziej przenośny.Use this option to help you identify and fix conformance issues in your code, to make it both more correct and more portable.

SkładniaSyntax

/ permissive-/permissive-

UwagiRemarks

Ta opcja jest obsługiwana w programie Visual Studio 2017 i nowszych wersjach.This option is supported in Visual Studio 2017 and later.

Możesz użyć / permissive- opcję kompilatora, aby określić zachowanie zgodne z normami kompilatora.You can use the /permissive- compiler option to specify standards-conforming compiler behavior. Ta opcja powoduje wyłączenie warunki dotyczące zachowania i ustawia /Zc opcje kompilatora, aby uzyskać pełną zgodność.This option disables permissive behaviors, and sets the /Zc compiler options for strict conformance. W środowisku IDE ta opcja sprawia, że aparat podkreślenie niezgodnych kodu IntelliSense.In the IDE, this option also makes the IntelliSense engine underline non-conforming code.

Domyślnie / permissive- opcja jest ustawiana w nowe projekty utworzone przez program Visual Studio 2017 w wersji 15.5 i nowszych wersjach.By default, the /permissive- option is set in new projects created by Visual Studio 2017 version 15.5 and later versions. Nie ustawiono domyślne we wcześniejszych wersjach.It is not set by default in earlier versions. Gdy opcja jest ustawiona, kompilator generuje błędy diagnostycznych lub ostrzeżenia podczas konstrukcji językowych niestandardowych są wykrywane w kodzie, w tym niektóre typowe błędy w pre-C ++ 11 kodu.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- opcja jest zgodna z prawie wszystkie pliki nagłówkowe z najnowszych zestawów Windows, takich jak Software Development Kit (SDK) lub Windows Driver Kit (WDK), począwszy od Windows SDK Fall Creators Update (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). Starsze wersje zestawu SDK może kompilacja nie powiedzie się w obszarze / permissive- różne źródła przyczyny zgodność kodu.Older versions of the SDK may fail to compile under /permissive- for various source code conformance reasons. Kompilator i dostarczaj zestawów SDK na osiach czasu z różnych wersji, w związku z tym występują pewne problemy pozostałych.The compiler and SDKs ship on different release timelines, therefore there are some remaining issues. W przypadku określonego nagłówka pliku problemów, zobacz problemów nagłówka Windows poniżej.For specific header file issues, see Windows header issues below.

/ Permissive- zestawy opcji /Zc: strictstrings i /Zc: rvaluecast opcje do zachowania zgodności.The /permissive- option sets the /Zc:strictStrings and /Zc:rvalueCast options to conforming behavior. Wartością domyślną niezgodnych zachowanie.They default to non-conforming behavior. Można przekazać określonego /Zc opcje po / permissive- w wierszu polecenia, aby zastąpić to zachowanie.You can pass specific /Zc options after /permissive- on the command line to override this behavior.

W wersjach kompilatora, począwszy od programu Visual Studio 2017 w wersji 15.3 / permissive- zestawy opcji /Zc: ternary opcji.In versions of the compiler beginning in Visual Studio 2017 version 15.3, the /permissive- option sets the /Zc:ternary option. Kompilator wykonuje kilka wymagań dotyczących nazwy dwufazowe wyszukiwanie.The compiler also implements more of the requirements for two-phase name look-up. Gdy / permissive- wyboru jest zaznaczone, w którym kompilator analizuje funkcji i klas definicjach szablonów, identyfikowanie nazwy zależne i zależne od innych niż używane w szablonach.When the /permissive- option is set, the compiler parses function and class template definitions, identifying dependent and non-dependent names used in the templates. W tej wersji odbywa się tylko nazwa analizy zależności.In this release, only name dependency analysis is performed.

Rozszerzenia specyficznymi dla środowiska i obszary języka standard pozostawia do wykonania nie dotyczy / permissive-.Environment-specific extensions and language areas that the standard leaves up to the implementation are not affected by /permissive-. Na przykład specyficzne dla firmy Microsoft __declspec, Konwencja wywoływania i obsługi słów kluczowych i dyrektyw pragma specyficznych dla kompilatora lub atrybutów wyjątków strukturalnych nie są oznaczone przez kompilator w / permissive- trybu.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- opcja używa obsługi zgodności w bieżącej wersji kompilatora ustalenie konstrukcji języka, które są niezgodne.The /permissive- option uses the conformance support in the current compiler version to determine which language constructs are non-conforming. Opcja nie określa, czy kod jest zgodny z określoną wersją C++ standard.The option does not determine if your code conforms to a specific version of the C++ standard. Aby włączyć wszystkie obsługa kompilatora zaimplementowane do najnowszego standardu projekt, należy użyć /std:latest opcji.To enable all implemented compiler support for the latest draft standard, use the /std:latest option. Aby ograniczyć obsługa kompilatora do aktualnie wdrożonych standardzie C ++ 17, należy użyć /STD: c ++ 17 opcji.To restrict the compiler support to the currently implemented C++17 standard, use the /std:c++17 option. Aby ograniczyć obsługę kompilatora, aby lepiej dopasować standard C ++ 14, należy użyć /STD: c ++ 14 opcji, co jest ustawieniem domyślnym.To restrict the compiler support to more closely match the C++14 standard, use the /std:c++14 option, which is the default.

Nie wszystkie C ++ 11, C ++ 14 lub C ++ 17 zgodne z normami kodu jest obsługiwana przez kompilator języka Visual C++ w programie Visual Studio 2017.Not all C++11, C++14, or C++17 standards-conforming code is supported by the Visual C++ compiler in Visual Studio 2017. W zależności od wersji programu Visual Studio / permissive- opcji może nie wykryć problemy dotyczące niektóre aspekty dwufazowe wyszukiwanie nazw, powiązanie odwołanie niestałe do tymczasowej, traktowanie init kopię jako bezpośrednie init, umożliwiając wiele zdefiniowanych przez użytkownika konwersje inicjowania lub alternatywne tokenów dla operatorów logicznych i innych zagadnień-obsługiwany zgodność.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. Aby uzyskać więcej informacji na temat problemów ze zgodnością w języku Visual C++, zobacz niestandardowe zachowanie.For more information about conformance issues in Visual C++, see Nonstandard Behavior. Aby uzyskać najbardziej z / permissive-, zaktualizować program Visual Studio do najnowszej wersji.To get the most out of /permissive-, update Visual Studio to the latest version.

Jak naprawić kodHow to fix your code

Poniżej przedstawiono kilka przykładów kodu, który zostanie wykryte jako niezgodne, gdy używasz / permissive-, wraz z sugerują sposoby rozwiązywania problemów.Here are some examples of code that is detected as non-conforming when you use /permissive-, along with suggested ways to fix the issues.

Użyj domyślnej jako identyfikatora w kodzie natywnymUse default as an identifier in native code

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

Wyszukiwanie członków w podstawowym zależneLookup 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();
}

Użyj kwalifikowanej nazwy w deklaracjach składowychUse of qualified names in member declarations

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

Inicjowanie wielu składowych Unii w inicjatorze składowejInitialize 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;
};

Reguły wyszukiwania nazwy przyjazne ukryteHidden 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.
}

Użyj Typy wyliczeniowe w granice tablicyUse 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.

Użycie dla każdego w kodzie natywnymUse 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)
    {
        // ...
    }
}

Korzystanie z atrybutów ATLUse 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()
};

Niejednoznaczny operator warunkowy argumentówAmbiguous conditional operator arguments

W wersjach kompilatora przed Visual Studio 2017 w wersji 15.3, kompilator zaakceptowane argumenty operator warunkowy (lub operator trójargumentowy) ?: uwzględnianych niejednoznaczne przez Standard.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. W / permissive- tryb, kompilator generuje teraz jeden lub więcej diagnostyki w przypadkach, w których skompilowany bez diagnostyki we wcześniejszych wersjach.In /permissive- mode, the compiler now issues one or more diagnostics in cases that compiled without diagnostics in earlier versions.

Błędy typowych, które mogą wynikać z tej zmiany obejmują:Commmon errors that may result from this change include:

  • Błąd C2593: 'operator'?error C2593: 'operator ?' jest niejednoznacznyis ambiguous

  • Błąd C2679: binarny '?': znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "B" (lub nie jest dopuszczalne konwersja)error C2679: binary '?': no operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

  • Błąd C2678: binarny '?': znaleziono żadnego operatora, który przyjmuje lewostronny operand typu "A" (lub nie jest dopuszczalne konwersja)error C2678: binary '?': no operator found which takes a left-hand operand of type 'A' (or there is no acceptable conversion)

  • Błąd C2446: ":": Brak konwersji z 'B', 'A'error C2446: ':': no conversion from 'B' to 'A'

Wzorzec typowy kod, który może być przyczyną tego problemu jest, gdy niektóre klasy C zawiera zarówno niejawnego konstruktora z innego typu T, jak i operator-jawnej konwersji typu T. W takim przypadku zarówno konwersja 2nd argumentów na typ 3 i konwersji argumentu 3, typ 2. są prawidłowe konwersje niejednoznacznego zgodnie ze standardem.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 2nd argument to the type of the 3rd and the conversion of the 3rd argument to the type of the 2nd are valid conversions, which is 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;

Ma ważny wyjątek, aby ten typowy wzorzec, gdy T reprezentuje jeden z typów ciąg zakończony znakiem null (na przykład const char *, const char16_t *i tak dalej) i rzeczywisty argument ?: jest ciągiem literału odpowiedniego typu.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 zmianie uległa semantyki C ++ 14.C++17 has changed semantics from C++14. W rezultacie kod w przykładzie 2 jest akceptowany w obszarze /STD: c ++ 14 i odrzucone w obszarze /STD: c ++ 17 podczas /Zc: ternary lub /permissive- jest używany.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);

Inny przypadek, w którym zostaną wyświetlone błędy znajduje się w operatorów warunkowych, z jednym argumentem typu void.Another case where you may see errors is in conditional operators with one argument of type void. Ten przypadek może być często używany w makra ASSERT podobne.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__))

Ponadto mogą pojawić się błędy w szablonie metaprogramowanie, gdzie typy wyników operatora warunkowego mogą ulec zmianie w obszarze /Zc: ternary i / permissive-.You may also see errors in template metaprogramming, where conditional operator result types may change under /Zc:ternary and /permissive-. Jednym ze sposobów, aby rozwiązać ten problem, jest użycie std::remove_reference wynikowy typu.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

Nazwa dwufazowe wyszukiwanieTwo-phase name look up

Gdy / permissive- wyboru jest zaznaczone, w którym kompilator analizuje funkcji i klas definicjach szablonów, identyfikowanie nazwy zależne i zależne od innych niż używane w szablonach, zgodnie z wymaganiami dla nazwy dwufazowe wyszukiwanie.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. W programie Visual Studio 2017 w wersji 15.3 Nazwa zależności analiza jest wykonywana.In Visual Studio 2017 version 15.3, name dependency analysis is performed. W szczególności nazwy zależne od innych, które nie zostały zadeklarowane w kontekście definicji szablonu spowodować, że komunikat diagnostyczny zgodnie z wymogami normy 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. W programie Visual Studio 2017 wersji 15.7 również odbywa się powiązania nazwy zależne od innych, które wymagają argumentów zależne odnośnika w kontekście definicji.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();
}

Jeśli chcesz starsze zachowanie dwufazowe wyszukiwanie, ale w przeciwnym razie ma / permissive- zachowanie, Dodaj /Zc:twoPhase- opcji.If you want legacy behavior for two-phase lookup, but otherwise want /permissive- behavior, add the /Zc:twoPhase- option.

Problemy z nagłówka WindowsWindows header issues

/ Permissive- opcja jest zbyt restrykcyjny dla wersji zestawów Windows przed SDK Windows Fall Creators Update (10.0.16299.0) lub Windows Driver Kit (WDK) w wersji 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. Firma Microsoft zaleca, zaktualizuj do najnowszej wersji zestawów Windows, aby można było używać / permissive- w kodzie sterownika Windows lub urządzenia.We recommend you update to the latest versions of the Windows Kits in order to use /permissive- in your Windows or device driver code.

Niektóre pliki nagłówkowe w kwietniu Windows SDK z aktualizacją 2018 r. (10.0.17134.0), SDK Windows Fall Creators Update (10.0.16299.0) lub Windows Driver Kit (WDK) 1709, nadal masz problemy, które są zgodne z użyciem /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-. W celu obejścia tych problemów, firma Microsoft zaleca korzystanie z tych nagłówków można ograniczyć do tylko tych plików kodu źródłowego, które wymagają i Usuń / permissive- opcję podczas kompilowania dla tych plików źródłowych określonego kodu.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.

Tych nagłówków biblioteki WRL WinRT, wydana w Windows kwietnia 2018 r. pakietu SDK aktualizacji (10.0.17134.0) nie są czyste z / permissive-.These WinRT WRL headers released in the Windows April 2018 Update SDK (10.0.17134.0) are not clean with /permissive-. Aby uniknąć tych problemów, nie należy używać / permissive-, lub użyj / permissive- z /Zc:twoPhase- podczas pracy z tych nagłówków:To work around these issues, either do not use /permissive-, or use /permissive- with /Zc:twoPhase- when working with these headers:

  • Problemy z 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
    
  • Wysłać 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'
    

Tych nagłówków trybu użytkownika, wydana w Windows kwietnia 2018 r. pakietu SDK aktualizacji (10.0.17134.0) nie są czyste z / permissive-.These User Mode headers released in the Windows April 2018 Update SDK (10.0.17134.0) are not clean with /permissive-. Aby obejść ten problem, nie należy używać / permissive- podczas pracy z tych nagłówków:To work around these issues, do not use /permissive- when working with these headers:

  • Problemy z 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
    
  • Wysłać 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
    
  • Problemy z 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'
    

Te problemy są specyficzne dla nagłówków trybu użytkownika w Windows SDK Fall Creators Update (10.0.16299.0):These issues are specific to User Mode headers in the Windows Fall Creators Update SDK (10.0.16299.0):

  • Wysłać um/Query.hIssue in um/Query.h

    Korzystając z / permissive- przełącznika kompilatora tagRESTRICTION struktury nie kompiluje się z powodu case(RTOr) elementu członkowskiego "lub".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;
    };
    

    Aby rozwiązać ten problem, skompiluj pliki, które zawierają Query.h bez / permissive- opcji.To address this issue, compile files that include Query.h without the /permissive- option.

  • Wysłać um/cellularapi_oem.hIssue in um/cellularapi_oem.h

    Korzystając z / permissive- przełącznika kompilatora, deklaracja enum UICCDATASTOREACCESSMODE powoduje, że ostrzeżenia:When using the /permissive- compiler switch, the forward declaration of enum UICCDATASTOREACCESSMODE causes a warning:

    typedef enum UICCDATASTOREACCESSMODE UICCDATASTOREACCESSMODE; // C4471
    

    Deklaracja wyliczenia niewystępującego w zakresie jest rozszerzeniem firmy Microsoft.The forward declaration of unscoped enum is a Microsoft extension. Aby rozwiązać ten problem, skompiluj pliki, które zawierają cellularapi_oem.h bez / permissive- , lub użyć /wd możliwość wyciszyć ostrzeżenie 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.

  • Wysłać um/omscript.hIssue in um/omscript.h

    W języku C ++ 03, konwersja z literału ciągu znaków na BSTR (czyli element typedef do "wchar_t *") jest przestarzałe, ale dozwolone.In C++03, a conversion from a string literal to BSTR (which is a typedef to 'wchar_t *') is deprecated but allowed. W języku C++ 11 konwersja nie jest już dozwolone.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
    

    Aby rozwiązać ten problem, skompiluj pliki, które zawierają omscript.h bez / permissive- , lub użyć /Zc:strictStrings- zamiast tego.To address this issue, compile files that include omscript.h without the /permissive- option, or use /Zc:strictStrings- instead.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual StudioTo set this compiler option in the Visual Studio development environment

W programie Visual Studio 2017 w wersji 15.5 i nowszych wersjach wykonaj następującą procedurę:In Visual Studio 2017 version 15.5 and later versions, use this procedure:

  1. Otwórz swój projekt stron właściwości okno dialogowe.Open your project's Property Pages dialog box.

  2. Wybierz właściwości konfiguracji > C/C++ > języka stronę właściwości.Select the Configuration Properties > C/C++ > Language property page.

  3. Zmiana tryb zgodności wartość właściwości tak (/ permissive-).Change the Conformance mode property value to Yes (/permissive-). Wybierz OK lub Zastosuj Aby zapisać zmiany.Choose OK or Apply to save your changes.

W wersjach starszych niż program Visual Studio 2017 w wersji 15.5 wykonaj następującą procedurę:In versions before Visual Studio 2017 version 15.5, use this procedure:

  1. Otwórz swój projekt stron właściwości okno dialogowe.Open your project's Property Pages dialog box.

  2. Wybierz właściwości konfiguracji > C/C++ > wiersza polecenia stronę właściwości.Select the Configuration Properties > C/C++ > Command Line property page.

  3. Wprowadź / permissive- w — opcja kompilatora dodatkowe opcje pole.Enter the /permissive- compiler option in the Additional Options box. Wybierz OK lub Zastosuj Aby zapisać zmiany.Choose OK or Apply to save your changes.

Aby programowo ustawić tę opcję kompilatoraTo set this compiler option programmatically

Zobacz takżeSee also