Bagikan melalui


main argumen fungsi dan baris perintah

Semua program C++ harus memiliki main fungsi. Jika Anda mencoba mengkompilasi program C++ tanpa main fungsi, pengkompilasi akan menimbulkan kesalahan. (Pustaka dan static pustaka tautan dinamis tidak memiliki main fungsi.) Fungsi ini main adalah tempat kode sumber Anda memulai eksekusi, tetapi sebelum program memasuki fungsi, semua static anggota kelas tanpa inisialisasi main eksplisit diatur ke nol. Di Microsoft C++, objek global static juga diinisialisasi sebelum masuk ke main. Beberapa batasan berlaku untuk main fungsi yang tidak berlaku untuk fungsi C++ lainnya. Fungsi main:

  • Tidak dapat kelebihan beban (lihat Kelebihan beban fungsi).
  • Tidak dapat dinyatakan sebagai inline.
  • Tidak dapat dinyatakan sebagai static.
  • Tidak dapat memiliki alamat yang diambil.
  • Tidak dapat dipanggil dari program Anda.

Tanda main tangan fungsi

Fungsi main ini tidak memiliki deklarasi, karena dibangun ke dalam bahasa. Jika ya, sintaks deklarasi untuk main akan terlihat seperti ini:

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

Jika tidak ada nilai pengembalian yang ditentukan dalam main, pengkompilasi menyediakan nilai pengembalian nol.

Argumen baris perintah standar

Argumen untuk main memungkinkan penguraian baris perintah argumen yang nyaman. Jenis untuk argc dan argv didefinisikan oleh bahasa. Nama dan argcargv tradisional, tetapi Anda dapat menamainya apa pun yang Anda suka.

Definisi argumen adalah sebagai berikut:

argc
Bilangan bulat yang berisi jumlah argumen yang mengikuti di argv. Parameter argc selalu lebih besar dari atau sama dengan 1.

argv
Array string null-terminated yang mewakili argumen baris perintah yang dimasukkan oleh pengguna program. Menurut konvensi, argv[0] adalah perintah yang dengannya program dipanggil. argv[1] adalah argumen baris perintah pertama. Argumen terakhir dari baris perintah adalah argv[argc - 1], dan argv[argc] selalu NULL.

Untuk informasi tentang cara menekan pemrosesan baris perintah, lihat Menyesuaikan pemrosesan baris perintah C++.

Catatan

Menurut konvensi, argv[0] adalah nama file program. Namun, di Windows dimungkinkan untuk menelurkan proses dengan menggunakan CreateProcess. Jika Anda menggunakan argumen pertama dan kedua (lpApplicationName dan lpCommandLine), argv[0] mungkin bukan nama yang dapat dieksekusi. Anda dapat menggunakan GetModuleFileName untuk mengambil nama yang dapat dieksekusi, dan jalurnya yang sepenuhnya memenuhi syarat.

Ekstensi khusus Microsoft

Bagian berikut ini menjelaskan perilaku khusus Microsoft.

wmain Fungsi dan _tmain makro

Jika Anda merancang kode sumber untuk menggunakan wide acter Unicode char, Anda dapat menggunakan titik masuk khusus wmain Microsoft, yang merupakan versi wide-acterchar dari main. Berikut sintaksis deklarasi yang efektif untuk wmain:

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

Anda juga dapat menggunakan makro khusus _tmainMicrosoft , yang merupakan makro praprosesor yang ditentukan dalam tchar.h. _tmain diselesaikan kecuali main_UNICODE didefinisikan. Dalam hal ini, _tmain diselesaikan ke wmain. _tmain Makro dan makro lain yang dimulai berguna _t untuk kode yang harus membangun versi terpisah untuk set acter yang sempit dan lebarchar. Untuk informasi selengkapnya, lihat Menggunakan pemetaan teks generik.

void Kembali darimain

Sebagai ekstensi Microsoft, main fungsi dan wmain dapat dinyatakan sebagai mengembalikan void (tidak ada nilai pengembalian). Ekstensi ini juga tersedia di beberapa kompilator lain, tetapi penggunaannya tidak disarankan. Ini tersedia untuk simetri saat main tidak mengembalikan nilai.

Jika Anda menyatakan main atau sebagai mengembalikan void, Anda tidak dapat mengembalikan exit kode ke proses induk atau sistem operasi dengan menggunakan returnwmain pernyataan. Untuk mengembalikan exit kode saat main atau wmain dinyatakan sebagai void, Anda harus menggunakan fungsi .exit

Argumen envp baris perintah

Tanda main tangan atau wmain memungkinkan ekstensi khusus Microsoft opsional untuk akses ke variabel lingkungan. Ekstensi ini juga umum di kompiler lain untuk sistem Windows dan UNIX. Namanya envp tradisional, tetapi Anda dapat memberi nama parameter lingkungan apa pun yang Anda suka. Berikut adalah deklarasi efektif untuk daftar argumen yang menyertakan parameter lingkungan:

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

envp
Parameter opsional envp adalah array string yang mewakili variabel yang ditetapkan di lingkungan pengguna. Array ini dihentikan oleh entri NULL. Ini dapat dinyatakan sebagai array pointer ke char (char *envp[]) atau sebagai penunjuk ke pointer ke char (char **envp). Jika program Anda menggunakan alih-alih wmainmain, gunakan wchar_t jenis data alih-alih char.

Blok lingkungan diteruskan ke main dan wmain adalah salinan "beku" dari lingkungan saat ini. Jika nanti Anda mengubah lingkungan dengan melakukan panggilan ke putenv atau _wputenv, lingkungan saat ini (seperti yang dikembalikan oleh getenv atau _wgetenv dan variabel _environ atau _wenviron ) akan berubah, tetapi blok yang diacu oleh envp tidak akan berubah. Untuk informasi selengkapnya tentang cara menekan pemrosesan lingkungan, lihat Menyesuaikan pemrosesan baris perintah C++. Argumen envp kompatibel dengan standar C89, tetapi tidak dengan standar C++.

Contoh argumen ke main

Contoh berikut menunjukkan cara menggunakan argcargumen , , argvdan envp ke main:

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

Mengurai argumen baris perintah C++

Aturan penguraian baris perintah yang digunakan oleh kode Microsoft C/C++ khusus Microsoft. Kode startup runtime menggunakan aturan ini saat menginterpretasikan argumen yang diberikan pada baris perintah sistem operasi:

  • Argumen dibatasi oleh spasi kosong, yang merupakan spasi atau tab.

  • Argumen pertama (argv[0]) diperlakukan secara khusus. Ini mewakili nama program. Karena harus berupa nama jalur yang valid, bagian yang dikelilingi oleh tanda kutip ganda (") diizinkan. Tanda kutip ganda tidak disertakan dalam output argv[0]. Bagian yang dikelilingi oleh tanda kutip ganda mencegah interpretasi spasi atau aktor tab charsebagai akhir argumen. Aturan selanjutnya dalam daftar ini tidak berlaku.

  • String yang dikelilingi oleh tanda kutip ganda ditafsirkan sebagai argumen tunggal, yang mungkin berisi aktor spasi charputih. String yang dikutip dapat disematkan dalam argumen. Tanda sisipan (^) tidak dikenali sebagai aktor escape charatau pemisah. Dalam string yang dikutip, sepasang tanda kutip ganda ditafsirkan sebagai tanda kutip ganda escape tunggal. Jika baris perintah berakhir sebelum tanda kutip ganda penutupan ditemukan, maka semua character yang dibaca sejauh ini adalah output sebagai argumen terakhir.

  • Tanda kutip ganda yang didahului oleh garis miring terbalik (\") ditafsirkan sebagai tanda kutip ganda literal (").

  • Garis miring terbalik ditafsirkan secara harfiah, kecuali garis miring terbalik segera mendahului tanda kutip ganda.

  • Jika garis miring terbalik berjumlah genap diikuti dengan tanda kutip ganda, maka satu garis miring terbalik (\) ditempatkan dalam array argv untuk setiap pasangan garis miring terbalik (\\), dan tanda kutip ganda (") ditafsirkan sebagai pemisah string.

  • Jika garis miring terbalik berjumlah ganjil diikuti dengan tanda kutip ganda, maka satu garis miring terbalik (\) ditempatkan dalam array argv untuk setiap pasangan garis miring terbalik (\\). Tanda kutip ganda ditafsirkan sebagai urutan escape oleh garis miring terbalik ing,mainmenyebabkan tanda kutip ganda harfiah (") ditempatkan di argv.

Contoh penguraian argumen baris perintah

Program berikut menunjukkan bagaimana argumen baris perintah diteruskan:

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

Hasil penguraian baris perintah

Tabel berikut menunjukkan contoh input dan output yang diharapkan, menunjukkan aturan dalam daftar sebelumnya.

Input baris perintah 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

Ekspansi kartubebas

Pengkompilasi Microsoft secara opsional memungkinkan Anda menggunakan aktor wildcardchar, tanda tanya (?) dan tanda bintang (*), untuk menentukan argumen nama file dan jalur pada baris perintah.

Argumen baris perintah ditangani oleh rutinitas internal dalam kode pengaktifan runtime, yang secara default tidak memperluas kartubebas ke dalam string terpisah dalam argv array string. Anda dapat mengaktifkan ekspansi kartubebas dengan menyertakan setargv.obj file (wsetargv.obj file untuk wmain) di /link opsi pengkompilasi atau baris perintah Anda LINK .

Untuk informasi selengkapnya tentang opsi penaut startup runtime, lihat Opsi tautan.

Menyesuaikan pemrosesan baris perintah C++

Jika program Anda tidak mengambil argumen baris perintah, Anda dapat menekan rutinitas pemrosesan baris perintah untuk menghemat sejumlah kecil ruang. Untuk menekan penggunaannya, sertakan file noarg.obj (untuk main dan wmain) dalam opsi kompilator /link atau baris perintah LINK Anda.

Begitu juga, jika Anda tidak pernah mengakses tabel lingkungan melalui argumen envp, Anda dapat menekan rutinitas pemrosesan lingkungan internal. Untuk menekan penggunaannya, sertakan file noenv.obj (untuk main dan wmain) dalam opsi kompilator /link atau baris perintah LINK Anda.

Program Anda mungkin melakukan panggilan ke keluarga rutin spawn atau exec di pustaka runtime C. Jika ya, Anda tidak boleh menekan rutinitas pemrosesan lingkungan, karena ini digunakan untuk meneruskan lingkungan dari proses induk ke proses anak.

Baca juga

Konsep dasar