ใน C++ IDE และคอมไพเลอร์จำนวนมาก เมื่อสร้างฟังก์ชันหลักสำหรับคุณ จะมีลักษณะดังนี้:

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

เมื่อฉันโค้ด C++ โดยไม่มี IDE เพียงแค่ใช้คอมไพเลอร์บรรทัดคำสั่ง ฉันพิมพ์:

int main()

โดยไม่มีพารามิเตอร์ใดๆ สิ่งนี้หมายความว่าอย่างไร และมีความสำคัญต่อโปรแกรมของฉันหรือไม่

ตอบ

argvและargcเป็นวิธีการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งmain()ใน C และ C++

argcargvจะมีจำนวนของสตริงที่ชี้ไปตาม ค่านี้ (ในทางปฏิบัติ) จะเท่ากับ 1 บวกกับจำนวนอาร์กิวเมนต์ เนื่องจากการใช้งานแทบทั้งหมดจะเติมชื่อโปรแกรมไว้ข้างหน้าอาร์เรย์

ตัวแปรถูกตั้งชื่อargc( จำนวนอาร์กิวเมนต์ ) และargv( อาร์กิวเมนต์ vector ) ตามแบบแผน แต่สามารถระบุตัวระบุที่ถูกต้องได้: int main(int num_args, char** arg_strings)ใช้ได้เท่ากัน

นอกจากนี้ยังสามารถละเว้นได้ทั้งหมด โดยให้ผลint main()หากคุณไม่ต้องการประมวลผลอาร์กิวเมนต์บรรทัดคำสั่ง

ลองใช้โปรแกรมต่อไปนี้:

#include <iostream>

int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:" << std::endl;
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << std::endl;
    }
}

เรียกใช้ด้วย./test a1 b2 c3จะส่งออก

Have 4 arguments:
./test
a1
b2
c3

argcคือจำนวนอาร์กิวเมนต์ที่ส่งผ่านไปยังโปรแกรมของคุณจากบรรทัดรับคำสั่งและargvเป็นอาร์เรย์ของอาร์กิวเมนต์

คุณสามารถวนซ้ำอาร์กิวเมนต์โดยรู้จำนวนเช่น:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}

สมมติว่าคุณเรียกใช้โปรแกรมของคุณ (โดยใช้shไวยากรณ์):

myprog arg1 arg2 'arg 3'

หากคุณประกาศ main ของคุณเป็นint main(int argc, char *argv[])ดังนั้น (ในสภาพแวดล้อมส่วนใหญ่) คุณmain()จะถูกเรียกราวกับว่า:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

อย่างไรก็ตาม หากคุณประกาศ main ของคุณเป็นint main()จะถูกเรียกว่า

exit(main());

และคุณไม่ได้รับการโต้แย้งผ่าน

สองสิ่งที่ควรทราบเพิ่มเติม:

  1. mainเหล่านี้เป็นเพียงสองลายเซ็นมาตรฐานบังคับสำหรับ หากแพลตฟอร์มใดยอมรับการโต้แย้งเพิ่มเติมหรือประเภทการส่งคืนอื่น นั่นเป็นส่วนขยายและไม่ควรเชื่อถือในโปรแกรมแบบพกพา
  2. *argv[]และ**argvเทียบเท่ากันพอดี ดังนั้นคุณสามารถเขียนint main(int argc, char *argv[])เป็นint main(int argc, char **argv).

พารามิเตอร์ที่ใช้mainแทนพารามิเตอร์บรรทัดคำสั่งที่จัดเตรียมให้กับโปรแกรมเมื่อเริ่มทำงาน argcพารามิเตอร์หมายถึงจำนวนของการขัดแย้งบรรทัดคำสั่งและchar *argv[]เป็นอาร์เรย์ของสตริง (ชี้ตัวอักษร) เป็นตัวแทนของการขัดแย้งบุคคลที่มีให้บริการในบรรทัดคำสั่ง

int main();

นี่เป็นการประกาศง่ายๆ ไม่สามารถใช้อาร์กิวเมนต์บรรทัดคำสั่งใดๆ

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

การประกาศนี้ใช้เมื่อโปรแกรมของคุณต้องใช้อาร์กิวเมนต์บรรทัดคำสั่ง เมื่อทำงานเช่นนี้:

myprogram arg1 arg2 arg3

argcหรือ Argument Count จะถูกตั้งค่าเป็น 4 (สี่อาร์กิวเมนต์) และargv, หรือ Argument Vectors จะถูกเติมด้วยพอยน์เตอร์สตริงเป็น "myprogram", "arg1", "arg2" และ "arg3" การเรียกใช้โปรแกรม ( myprogram) รวมอยู่ในอาร์กิวเมนต์!

หรือคุณสามารถใช้:

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

สิ่งนี้ยังถูกต้อง

มีพารามิเตอร์อื่นที่คุณสามารถเพิ่มได้:

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

envpพารามิเตอร์นอกจากนี้ยังมีตัวแปรสภาพแวดล้อม แต่ละรายการเป็นไปตามรูปแบบนี้:

VARIABLENAME=VariableValue

แบบนี้:

SHELL=/bin/bash    

รายการตัวแปรสภาพแวดล้อมถูกยกเลิกด้วยค่า null

สำคัญ:อย่าใช้ค่าใด ๆargvหรือenvpค่าใด ๆโดยตรงในการเรียกไปที่system()! นี่เป็นช่องโหว่ด้านความปลอดภัยขนาดใหญ่เนื่องจากผู้ใช้ที่ประสงค์ร้ายสามารถตั้งค่าตัวแปรสภาพแวดล้อมเป็นคำสั่งบรรทัดคำสั่งและ (อาจ) สร้างความเสียหายมหาศาล โดยทั่วไป อย่าใช้system(). มีวิธีแก้ปัญหาที่ดีกว่าที่ดำเนินการผ่านไลบรารี C เกือบทุกครั้ง

mainฟังก์ชั่นสามารถมีสองพารามิเตอร์และargc เป็นพารามิเตอร์จำนวนเต็ม ( ) และเป็นจำนวนอาร์กิวเมนต์ที่ส่งผ่านไปยังโปรแกรมargvargcint

ชื่อโปรแกรมเป็นอาร์กิวเมนต์แรกเสมอ ดังนั้นจะมีอย่างน้อยหนึ่งอาร์กิวเมนต์สำหรับโปรแกรม และค่าต่ำสุดของargcwill คือหนึ่ง แต่ถ้าโปรแกรมมีอาร์กิวเมนต์สองตัว ค่าargcwill จะเป็นสาม

พารามิเตอร์argvชี้ไปยังอาร์เรย์สตริงและถูกเรียกว่าเวกเตอร์อาร์กิวเมนต์ เป็นอาร์เรย์สตริงหนึ่งมิติของอาร์กิวเมนต์ฟังก์ชัน

พารามิเตอร์แรกคือจำนวนอาร์กิวเมนต์ที่มีให้ และพารามิเตอร์ที่สองคือรายการสตริงที่แสดงถึงอาร์กิวเมนต์เหล่านั้น

ทั้ง

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

เป็นคำจำกัดความทางกฎหมายของจุดเริ่มต้นสำหรับโปรแกรม C หรือ C++ Stroustrup: คำถามที่พบบ่อยเกี่ยวกับสไตล์และเทคนิค C++ ให้รายละเอียดเกี่ยวกับรูปแบบที่เป็นไปได้หรือถูกกฎหมายสำหรับฟังก์ชันหลักของคุณ