Aracılığıyla paylaş


/permissive- (Standartlara uygunluk)

Derleyiciye standartlar uyumluluk modunu belirtin. Kodunuzda uyumluluk sorunlarını belirlemenize ve düzeltmenize yardımcı olmak, hem daha doğru hem de daha taşınabilir hale getirmek için bu seçeneği kullanın.

Sözdizimi

/permissive-
/permissive

Açıklamalar

Bu /permissive- seçenek Visual Studio 2017 ve sonraki sürümlerde desteklenir. /permissive , Visual Studio 2019 sürüm 16.8 ve sonraki sürümlerde desteklenir.

Standartlara uygun derleyici davranışını belirtmek için derleyici seçeneğini kullanabilirsiniz /permissive- . Bu seçenek izinli davranışları devre dışı bırakır ve katı uyumluluk için derleyici seçeneklerini ayarlar /Zc . IDE'de, bu seçenek IntelliSense altyapısının uyumsuz kodun altını çizmesini de sağlar.

seçeneği /permissive- , hangi dil yapılarının uyumlu olmadığını belirlemek için geçerli derleyici sürümünde uyumluluk desteğini kullanır. seçeneği, kodunuzun C++ standardının belirli bir sürümüne uygun olup olmadığını belirlemez. En son taslak standardı için uygulanan tüm derleyici desteğini etkinleştirmek için seçeneğini kullanın /std:c++latest . Derleyici desteğini şu anda uygulanan C++20 standardıyla kısıtlamak /std:c++20 için seçeneğini kullanın. Derleyici desteğini şu anda uygulanan C++17 standardıyla kısıtlamak /std:c++17 için seçeneğini kullanın. Derleyici desteğini C++14 standardıyla daha yakından eşleşecek şekilde kısıtlamak için varsayılan seçenek olan seçeneğini kullanın /std:c++14 .

Bu /permissive- seçenek, Visual Studio 2019 sürüm 16.8'den başlayan ve seçenek tarafından sürüm 16.11'de başlayan seçeneğe /std:c++20 göre örtük olarak ayarlanır/std:c++latest. /permissive- C++20 Modül desteği için gereklidir. Kodunuzun modül desteğine ihtiyacı yoktur ancak veya /std:c++latestaltında /std:c++20 başka özelliklerin etkinleştirilmesi gerekebilir. Sonunda tire olmadan seçeneğini kullanarak /permissive Microsoft uzantısı desteğini açıkça etkinleştirebilirsiniz. seçeneği, /permissive örtük olarak ayarlayan /permissive- herhangi bir seçeneğin ardından gelmelidir.

Varsayılan olarak, /permissive- seçenek Visual Studio 2017 sürüm 15.5 ve sonraki sürümler tarafından oluşturulan yeni projelerde ayarlanır. Önceki sürümlerde varsayılan olarak ayarlanmaz. seçenek ayarlandığında, derleyici kodunuzda standart olmayan dil yapıları algılandığında tanılama hataları veya uyarılar oluşturur. Bu yapılar C++11 öncesi koddaki bazı yaygın hataları içerir.

Bu /permissive- seçenek, Windows Fall Creators SDK'sından (10.0.16299.0) başlayarak Yazılım Geliştirme Seti (SDK) veya Windows Sürücü Seti (WDK) gibi en son Windows Kit'lerdeki üst bilgi dosyalarının neredeyse tamamıyla uyumludur. SDK'nın eski sürümleri çeşitli kaynak kodu uyumluluğu nedeniyle altında /permissive- derlenemiyor olabilir. Derleyici ve SDK'lar farklı sürüm zaman çizelgelerinde gönderildiğinden kalan bazı sorunlar vardır. Belirli üst bilgi dosyası sorunları için aşağıdaki Windows üst bilgi sorunları bölümüne bakın.

/permissive- seçeneği, , /Zc:strictStringsve /Zc:rvalueCast seçeneklerini uyumlu davranışa ayarlar/Zc:referenceBinding. Bu seçenekler varsayılan olarak uyumsuz davranıştır. Bu davranışı geçersiz kılmak için komut satırından sonra /permissive- belirli /Zc seçenekleri geçirebilirsiniz.

Visual Studio 2017 sürüm 15.3'te başlayan derleyici sürümlerinde seçeneği /permissive- ayarlar /Zc:ternary . Derleyici ayrıca iki aşamalı ad arama gereksinimlerinin daha fazlasını uygular. /permissive- Seçenek ayarlandığında, derleyici işlev ve sınıf şablonu tanımlarını ayrıştırarak şablonlarda kullanılan bağımlı ve bağımlı olmayan adları tanımlar. Bu sürümde yalnızca ad bağımlılığı analizi gerçekleştirilir.

Visual Studio 2022 Güncelleştirme 17.6 itibarıyla /permissive- ve /Zc:externConstexpr seçeneklerini ayarlar/Zc:lambda. Önceki sürümlerde ikisinde /permissive- de ayarlanmadı.

Ortama özgü uzantılar ve standart uygulamanın bıraktığı dil alanları tarafından etkilenmez /permissive-. Örneğin, Microsoft'a özgü __declspecçağırma kuralı ve yapılandırılmış özel durum işleme anahtar sözcükleri ve derleyiciye özgü pragma yönergeler veya öznitelikler derleyici tarafından modda /permissive- işaretlenmez.

Visual Studio 2017'nin önceki sürümlerindeki MSVC derleyicisi tüm C++11, C++14 veya C++17 standartlarına uygun kodları desteklemez. Visual Studio sürümüne bağlı olarak, /permissive- seçenek iki aşamalı ad aramanın bazı yönlerinde sorunları algılamayabilir, geçici bir başvuruya sabit olmayan bir başvuru bağlama, copy init'i doğrudan başlatma olarak ele alma, başlatma sırasında birden çok kullanıcı tanımlı dönüştürmeye izin verme veya mantıksal işleçler ve diğer desteklenmeyen uyumluluk alanları için alternatif belirteçler. Visual C++'daki uyumluluk sorunları hakkında daha fazla bilgi için bkz . Standart Dışı Davranış. sürümünden en iyi /permissive-şekilde yararlanmak için Visual Studio'yu en son sürüme güncelleştirin.

Kodunuzu düzeltme

Burada, kullanırken /permissive-uyumsuz olarak algılanan kod örneklerinin yanı sıra sorunları çözmenin önerilen yolları verilmiştir.

Yerel kodda tanımlayıcı olarak kullanma default

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

Bağımlı tabandaki üyeleri arama

template <typename T>
struct B
{
    void f() {}
    template <typename U>
    struct S { void operator()(){ return; } };
};

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 for non-template members and function
    // template members is a using statement:
    // using B<T>::f;
    // If it's a type, don't forget the 'typename' keyword.

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

    void h()
    {
        S<int> s; // C2065 or C3878
        // Since template S is dependent, the type must be qualified
        // with the `typename` keyword.
        // To fix, replace the declaration of s with:
        // typename B<T>::template S<int> s;
        // Or, use this:
        // typename D::template S<int> s;
        s();
    }
};

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

Üye bildirimlerinde nitelenmiş adların kullanımı

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

Üye başlatıcıda birden çok birleşim üyesi başlatma

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;
};

Gizli arkadaş adı arama kuralları

Sınıfın dışındaki bir bildirim, gizli bir arkadaşı görünür yapabilir:

// 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.

Değişmez değerin nullptr kullanılması bağımsız değişkene bağımlı aramayı engelleyebilir:

// 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.
}

kullanarak /Zc:hiddenFriendgizli arkadaş adı arama kurallarını bağımsız /permissive olarak etkinleştirebilirsiniz. Gizli arkadaş adı araması için eski davranış istiyorsanız ancak başka bir şekilde davranış istiyorsanız /permissive- seçeneğini kullanın /Zc:hiddenFriend- .

Dizi sınırlarında kapsamlı sabit listeleri kullanma

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.

Yerel koddaki her bir kod için kullanın

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 özniteliklerinin kullanımı

Microsoft'a özgü ATL öznitelikleri altında /permissive-sorunlara neden olabilir:

// Example 1
[uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")]
class A {};

Bunun yerine formu kullanarak __declspec sorunu çözebilirsiniz:

// Fix for example 1
class __declspec(uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")) B {};

Daha karmaşık bir örnek:

// 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
{};

Çözüm için ek derleme adımları gerekir. Bu durumda bir IDL dosyası oluşturun:

// 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()
};

Belirsiz koşullu işleç bağımsız değişkenleri

Derleyicinin Visual Studio 2017 sürüm 15.3'teki sürümlerinde, derleyici koşullu işleç (veya üçüncül işleç) ?: için Standart tarafından belirsiz kabul edilen bağımsız değişkenleri kabul etti. Modunda /permissive- , derleyici artık önceki sürümlerde tanılama olmadan derlenen durumlarda bir veya daha fazla tanılama sağlar.

Bu değişiklikten kaynaklanabilir yaygın hatalar şunlardır:

  • error C2593: 'operator ?' is ambiguous

  • error C2679: binary '?': no operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

  • error C2678: binary '?': no operator found which takes a left-hand operand of type 'A' (or there is no acceptable conversion)

  • error C2446: ':': no conversion from 'B' to 'A'

Bu soruna neden olabilecek tipik bir kod düzeni, bir sınıfın C hem başka bir türden T açık olmayan bir oluşturucu hem de türü Tiçin açık olmayan bir dönüştürme işleci sağlamasıdır. İkinci bağımsız değişkenin üçüncü bağımsız değişkenin türüne dönüştürülmesi geçerli bir dönüştürmedir. Üçüncü bağımsız değişkenin ikinci bağımsız değişkenin türüne dönüştürülmesi de öyledir. Her ikisi de geçerli olduğundan, standarda göre belirsizdir.

// 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 olarak sonlandırılan dize türlerinden birini (örneğin, const char *, const char16_t *vb.) temsil ettiğinde ve için gerçek bağımsız değişken ?: karşılık gelen türde bir dize değişmez değeri olduğunda bu ortak desenin önemli bir özel durumu vardır. C++17, C++14 semantiğini değiştirdi. Sonuç olarak, 2. örnekteki kod veya kullanıldığında veya altında /std:c++17/Zc:ternary/permissive- kabul edilir /std:c++14 ve reddedilir.

// 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);

Koşullu işleçlerde, türünde voidbir bağımsız değişken içeren hatalar da görebilirsiniz. Bu durum ASSERT benzeri makrolarda yaygın olabilir.

// 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__))

Şablon meta programlamasında ve altında /Zc:ternary/permissive-koşullu işleç sonuç türlerinin değişebileceği hatalar da görebilirsiniz. Bu sorunu çözmenin bir yolu, sonuçta elde edilen türde kullanmaktır std::remove_reference .

// 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

İki aşamalı ad arama

/permissive- Seçenek ayarlandığında, derleyici işlev ve sınıf şablonu tanımlarını ayrıştırarak iki aşamalı ad arama için gereken şekilde şablonlarda kullanılan bağımlı ve bağımlı olmayan adları tanımlar. Visual Studio 2017 sürüm 15.3'te ad bağımlılığı analizi gerçekleştirilir. Özellikle, bir şablon tanımı bağlamında bildirilmeyen bağımlı olmayan adlar, ISO C++ standartlarının gerektirdiği şekilde bir tanılama iletisine neden olur. Visual Studio 2017 sürüm 15.7'de, tanım bağlamında bağımsız değişkene bağımlı arama gerektiren bağımlı olmayan adların bağlanması da yapılır.

// 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();
}

İki aşamalı arama için eski davranış istiyorsanız, ancak başka bir şekilde davranış istiyorsanız /permissive- , seçeneğini ekleyin /Zc:twoPhase- .

Windows üst bilgisi sorunları

Bu /permissive- seçenek, Windows Fall Creators Update SDK'sı (10.0.16299.0) veya Windows Driver Kit (WDK) sürüm 1709'dan önceki Windows Kit sürümleri için çok katıdır. Windows veya cihaz sürücü kodunuzda kullanmak /permissive- üzere Windows Kitleri'nin en son sürümlerine güncelleştirmenizi öneririz.

Windows Nisan 2018 Güncelleştirme SDK'sı (10.0.17134.0), Windows Fall Creators Update SDK (10.0.16299.0) veya Windows Driver Kit (WDK) 1709'daki bazı üst bilgi dosyaları, kullanımıyla /permissive-uyumsuz hale getiren sorunlara sahip olmaya devam eder. Bu sorunlara geçici bir çözüm olarak, bu üst bilgilerin kullanımını yalnızca bunları gerektiren kaynak kod dosyalarıyla kısıtlamanızı ve bu belirli kaynak kodu dosyalarını derlerken bu seçeneği kaldırmanızı /permissive- öneririz.

Windows Nisan 2018 Güncelleştirme SDK'sında (10.0.17134.0) yayımlanan bu WinRT WRL üst bilgileri ile /permissive-temiz değildir. Bu sorunlara /permissive-geçici bir çözüm bulmak için kullanmayın veya şu üst bilgilerle çalışırken ile /Zc:twoPhase- kullanın/permissive-:

  • uygulamasındaki sorunlar 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
    
  • Sorun: 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 Nisan 2018 Güncelleştirme SDK'sında (10.0.17134.0) yayımlanan bu Kullanıcı Modu üst bilgileri ile /permissive-temiz değildir. Bu sorunlara geçici bir çözüm bulmak için şu üst bilgilerle çalışırken kullanmayın /permissive- :

  • uygulamasındaki sorunlar 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
    
  • Sorun: 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
    
  • uygulamasındaki sorunlar 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'
    

Bu sorunlar, Windows Fall Creators Update SDK'sında (10.0.16299.0) Kullanıcı Modu üst bilgilerine özeldir:

  • Sorun: um/Query.h

    Derleyici anahtarını kullandığınızda/permissive-, tagRESTRICTION yapısı üyesi ornedeniyle case(RTOr) derlenemez.

    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;
    };
    

    Bu sorunu gidermek için seçeneği olmadan içeren Query.h dosyaları derleyin /permissive- .

  • Sorun: um/cellularapi_oem.h

    Derleyici anahtarını kullandığınızda /permissive- , iletme bildirimi bir uyarıya enum UICCDATASTOREACCESSMODE neden olur:

    typedef enum UICCDATASTOREACCESSMODE UICCDATASTOREACCESSMODE; // C4471
    

    Kapsamsız enum bir iletim bildirimi bir Microsoft uzantısıdır. Bu sorunu gidermek için, seçeneği olmadan /permissive- içeren cellularapi_oem.h dosyaları derleyin veya C4471 uyarısını /wd susturma seçeneğini kullanın.

  • Sorun: um/omscript.h

    C++03'te, dize değişmez değerden BSTR (tür tanımına wchar_t *) dönüştürme kullanım dışıdır ancak buna izin verilir. C++11'de dönüştürmeye artık izin verilmez.

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

    Bu sorunu gidermek için omscript.h içeren dosyaları seçeneği olmadan /permissive- derleyin veya bunun yerine kullanın /Zc:strictStrings- .

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

Visual Studio 2017 sürüm 15.5 ve sonraki sürümlerde şu yordamı kullanın:

  1. Projenizin Özellik Sayfaları iletişim kutusunu açın.

  2. Yapılandırma Özellikleri>C/C++>Dil özellik sayfasını seçin.

  3. Uyumluluk modu özellik değerini Evet (/izin-) olarak değiştirin. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.

Visual Studio 2017 sürüm 15.5'in önceki sürümlerinde şu yordamı kullanın:

  1. Projenizin Özellik Sayfaları iletişim kutusunu açın.

  2. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

  3. Ek Seçenekler kutusuna /permissive- derleyici seçeneğini girin. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.

Bu derleyici seçeneğini program üzerinden ayarlamak için

Ayrıca bkz.

MSVC Derleyicisi Seçenekleri
MSVC Derleyicisi Komut Satırı Söz Dizimi