Aracılığıyla paylaş


main işlev ve komut satırı bağımsız değişkenleri

Tüm C++ programlarının bir main işlevi olmalıdır. C++ programını işlev olmadan main derlemeye çalışırsanız, derleyici bir hata oluşturur. (Dinamik bağlantı kitaplıklarının ve static kitaplıklarının bir main işlevi yoktur.) İşlev main , kaynak kodunuzun yürütülmeye başladığı yerdir, ancak bir program işleve girmeden main önce, açık başlatıcıları olmayan tüm static sınıf üyeleri sıfır olarak ayarlanır. Microsoft C++'da, genel static nesneler de giriş mainöncesinde başlatılır. Diğer C++ işlevleri için main geçerli olmayan işleve çeşitli kısıtlamalar uygulanır. İşlev main :

  • Aşırı yüklenemez (bkz. İşlev aşırı yüklemesi).
  • olarak inlinebildirilemiyor.
  • olarak staticbildirilemiyor.
  • Adresi alınamıyor.
  • Programınızdan çağrılamıyor.

İşlev main imzası

İşlevin main bir bildirimi yoktur, çünkü dilde yerleşiktir. Bu durumda, için main bildirim söz dizimi şöyle görünür:

int main();
int main(int argc, char *argv[]);

içinde mainhiçbir dönüş değeri belirtilmezse, derleyici sıfır dönüş değeri sağlar.

Standart komut satırı bağımsız değişkenleri

için main bağımsız değişkenler, bağımsız değişkenlerin uygun komut satırı ayrıştırmasına izin verir. ve argv türleri argc dile göre tanımlanır. ve adları argc argv gelenekseldir, ancak istediğiniz gibi adlandırabilirsiniz.

Bağımsız değişken tanımları aşağıdaki gibidir:

argc
içinde izleyen argvbağımsız değişkenlerin sayısını içeren bir tamsayı. argc parametresi her zaman 1'e eşit veya daha büyüktür.

argv
Programın kullanıcısı tarafından girilen komut satırı bağımsız değişkenlerini temsil eden boş sonlandırılmış bir dize dizisi. Kural gereği, argv[0] programın çağrıldığı komutdur. argv[1] ilk komut satırı bağımsız değişkenidir. Komut satırındaki son bağımsız değişken , argv[argc - 1]ve argv[argc] her zaman NULL'tır.

Komut satırı işlemeyi gizleme hakkında bilgi için bkz . C++ komut satırı işlemeyi özelleştirme.

Not

Kural gereği, argv[0] programın dosya adıdır. Ancak, Windows'ta kullanarak CreateProcessbir işlem oluşturmak mümkündür. Hem birinci hem de ikinci bağımsız değişkenleri (lpApplicationName ve lpCommandLine) argv[0] kullanırsanız yürütülebilir ad olmayabilir. Yürütülebilir adı ve tam yolunu almak için kullanabilirsiniz GetModuleFileName .

Microsoft'a özgü uzantılar

Aşağıdaki bölümlerde Microsoft'a özgü davranış açıklanmaktadır.

wmain İşlev ve _tmain makro

Kaynak kodunuzu Unicode geniş karakterlerini kullanacak şekilde tasarlarsanız, Microsoft'a özgü wmain giriş noktasını kullanabilirsiniz. Bu, öğesinin maingeniş karakterli sürümüdür. için geçerli bildirim söz dizimi aşağıdadır wmain:

int wmain();
int wmain(int argc, wchar_t *argv[]);

Ayrıca, içinde tchar.htanımlanan bir önişlemci makro olan Microsoft'a özgü _tmainöğesini de kullanabilirsiniz. _tmaintanımlanmadığı sürece _UNICODE olarak main çözümleniyor. Bu durumda, _tmain olarak çözümler wmain. Ile _tmain başlayan _t makro ve diğer makrolar, hem dar hem de geniş karakter kümeleri için ayrı sürümler oluşturması gereken kodlar için kullanışlıdır. Daha fazla bilgi için bkz . Genel metin eşlemelerini kullanma.

Şu kaynaktan dönüyor:voidmain

Bir Microsoft uzantısı olarak ve main wmain işlevleri döndürülebilir void (dönüş değeri yok) olarak bildirilebilir. Bu uzantı diğer bazı derleyicilerde de kullanılabilir, ancak kullanılması önerilmez. Bir değer döndürmediğinde main simetri için kullanılabilir.

bildirirseniz main veya wmain döndürürsenizvoid, deyimini kullanarak return bir exit kodu üst işleme veya işletim sistemine döndüremezsiniz. veya wmain olarak voidbildirildiğinde main bir exit kod döndürmek için işlevini kullanmanız exit gerekir.

Komut envp satırı bağımsız değişkeni

main veya wmain imzaları, ortam değişkenlerine erişim için microsoft'a özgü isteğe bağlı bir uzantıya izin verir. Bu uzantı, Windows ve UNIX sistemleri için diğer derleyicilerde de yaygındır. Ad envp gelenekseldir, ancak ortam parametresini istediğiniz şekilde adlandırabilirsiniz. Ortam parametresini içeren bağımsız değişken listeleri için geçerli bildirimler şunlardır:

int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);

envp
İsteğe bağlı envp parametre, kullanıcının ortamında ayarlanan değişkenleri temsil eden bir dize dizisidir. Bu dizi bir NULL girdisi tarafından sonlandırılır. () işaretçileri char dizisi olarak veya (char *envp[]) işaretçilerinin charchar **envpişaretçisi olarak bildirilebilir. Programınız yerine mainkullanıyorsa wmain yerine veri türünü charkullanınwchar_t.

ve ortamına main wmain geçirilen ortam bloğu, geçerli ortamın "donmuş" bir kopyasıdır. Daha sonra veya _wputenviçin bir çağrı putenv yaparak ortamı değiştirirseniz, geçerli ortam (veya _wgetenv tarafından döndürüldükçe getenv ve _environ veya _wenviron değişkeni) değişir, ancak tarafından işaret edilen envp blok değişmez. Ortam işlemeyi gizleme hakkında daha fazla bilgi için bkz . C++ komut satırı işlemeyi özelleştirme. envp Bağımsız değişken C89 standardıyla uyumludur ancak C++ standartlarıyla uyumlu değildir.

Örnek bağımsız değişkenler: main

Aşağıdaki örnekte, için , argvve envp bağımsız değişkenlerinin nasıl kullanılacağı argcgösterilmektedirmain:

// argument_definitions.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>

using namespace std;
int main( int argc, char *argv[], char *envp[] )
{
    bool numberLines = false;    // Default is no line numbers.

    // If /n is passed to the .exe, display numbered listing
    // of environment variables.
    if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 )
         numberLines = true;

    // Walk through list of strings until a NULL is encountered.
    for ( int i = 0; envp[i] != NULL; ++i )
    {
        if ( numberLines )
            cout << i << ": "; // Prefix with numbers if /n specified
        cout << envp[i] << "\n";
    }
}

C++ komut satırı bağımsız değişkenlerini ayrıştırma

Microsoft C/C++ kodu tarafından kullanılan komut satırı ayrıştırma kuralları Microsoft'a özeldir. Çalışma zamanı başlangıç kodu, işletim sistemi komut satırında verilen bağımsız değişkenleri yorumlarken şu kuralları kullanır:

  • Bağımsız değişkenler boşluk veya sekme olan boşlukla sınırlandırılır.

  • İlk bağımsız değişken (argv[0]) özel olarak ele alınır. Program adını temsil eder. Geçerli bir yol adı olması gerektiğinden, çift tırnak işaretleri (") ile çevrili bölümlere izin verilir. Çift tırnak işaretleri çıkışa argv[0] dahil değildir. Çift tırnak işaretleri ile çevrili bölümler, bağımsız değişkenin sonu olarak bir boşluk veya sekme karakterinin yorumlanmasını engeller. Bu listedeki sonraki kurallar geçerli değildir.

  • Çift tırnak işaretleri ile çevrili bir dize, boşluk karakterleri içerebilen tek bir bağımsız değişken olarak yorumlanır. Tırnak içine alınmış bir dize bağımsız değişkene eklenebilir. Şapka işareti (^), kaçış karakteri veya sınırlayıcı olarak tanınmaz. Tırnak içinde bir çift tırnak işareti, tek bir kaçış çift tırnak işareti olarak yorumlanır. Bir kapanış çift tırnak işareti bulunmadan önce komut satırı biterse, şimdiye kadar okunan tüm karakterler son bağımsız değişken olarak çıktı olur.

  • Önünde ters eğik çizgi (\") olan çift tırnak işareti, değişmez değer çift tırnak işareti (") olarak yorumlanır.

  • Ters eğik çizgi, çift tırnak işaretinin hemen önüne gelmediği sürece tam anlamıyla yorumlanır.

  • Çift sayıda ters eğik çizgi ve ardından çift tırnak işareti gelirse, her ters eğik çizgi () çifti için diziye argv bir ters eğik çizgi (\\\) yerleştirilir ve çift tırnak işareti (") dize sınırlayıcısı olarak yorumlanır.

  • Tek sayıda ters eğik çizgi ve ardından çift tırnak işareti geliyorsa, her ters eğik çizgi () çifti için diziye argv bir ters eğik çizgi (\\\) yerleştirilir. Çift tırnak işareti, kalan ters eğik çizgi tarafından kaçış dizisi olarak yorumlanır ve sabit çift tırnak işaretinin (") içine argvyerleştirilmesine neden olur.

Komut satırı bağımsız değişken ayrıştırma örneği

Aşağıdaki program, komut satırı bağımsız değişkenlerinin nasıl geçirildiğini gösterir:

// command_line_arguments.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
int main( int argc,      // Number of strings in array argv
          char *argv[],   // Array of command-line argument strings
          char *envp[] )  // Array of environment variable strings
{
    int count;

    // Display each command-line argument.
    cout << "\nCommand-line arguments:\n";
    for( count = 0; count < argc; count++ )
         cout << "  argv[" << count << "]   "
                << argv[count] << "\n";
}

Komut satırlarını ayrıştırma sonuçları

Aşağıdaki tabloda, yukarıdaki listede yer alan kuralları gösteren örnek giriş ve beklenen çıkış gösterilmektedir.

Komut satırı girişi argv[1] argv[2] argv[3]
"abc" d e abc d e
a\\b d"e f"g h a\\b de fg h
a\\\"b c d a\"b c d
a\\\\"b c" d e a\\b c d e
a"b"" c d ab" c d

Joker karakter genişletmesi

Microsoft derleyicisi isteğe bağlı olarak komut satırında dosya adı ve yol bağımsız değişkenlerini belirtmek için soru işareti (?) ve yıldız işareti (* ) joker karakterlerini kullanmanıza olanak tanır.

Komut satırı bağımsız değişkenleri, çalışma zamanı başlangıç kodundaki bir iç yordam tarafından işlenir ve varsayılan olarak joker karakterler dize dizisinde argv ayrı dizelere genişletilmez. Derleyici seçeneklerinize veya komut satırınıza LINK /link dosyasını (wsetargv.obj için wmaindosyası) ekleyerek setargv.obj joker karakter genişletmeyi etkinleştirebilirsiniz.

Çalışma zamanı başlangıç bağlayıcı seçenekleri hakkında daha fazla bilgi için bkz . Bağlantı seçenekleri.

C++ komut satırı işlemeyi özelleştirme

Programınız komut satırı bağımsız değişkenlerini almazsa, az miktarda alan kazanmak için komut satırı işleme yordamını gizleyebilirsiniz. Kullanımını engellemek için, derleyici seçeneklerinize veya komut satırınıza dosyasını (hem de wmainmain için) ekleyinnoarg.obj.LINK /link

Benzer şekilde, ortam tablosuna bağımsız değişken aracılığıyla envp hiç erişmezseniz, iç ortam işleme yordamını gizleyebilirsiniz. Kullanımını engellemek için, derleyici seçeneklerinize veya komut satırınıza dosyasını (hem de wmainmain için) ekleyinnoenv.obj.LINK /link

Programınız, C çalışma zamanı kitaplığında spawn veya exec yordam ailesine çağrı yapabilir. Varsa, bir ortamı üst işlemden alt işleme geçirmek için kullanıldığından ortam işleme yordamını gizlememelisiniz.

Ayrıca bkz.

Temel kavramlar