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 argc
argv
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 _tmain
Microsoft , 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 return
wmain
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 wmain
main
, 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 argc
argumen , , argv
dan 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 outputargv[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 arrayargv
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 arrayargv
untuk setiap pasangan garis miring terbalik (\\
). Tanda kutip ganda ditafsirkan sebagai urutan escape oleh garis miring terbalik ing,mainmenyebabkan tanda kutip ganda harfiah ("
) ditempatkan diargv
.
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk