ดูเหมือนว่าargv[argc]
อยู่เสมอดังนั้นผมคิดว่าเราสามารถสำรวจรายการอาร์กิวเมนต์โดยไม่ต้องNULL
ลูปargc
เดียวwhile
จะทำสิ่งนี้
หากมีการNULL
ต่อท้ายargv
เสมอทำไมเราต้องมีargc
?
"\0"
ไม่เหมือนกับตัวชี้ NULL ( 0
เทียบเท่ากับ NULL ใน C ++)
ดูเหมือนว่าargv[argc]
อยู่เสมอดังนั้นผมคิดว่าเราสามารถสำรวจรายการอาร์กิวเมนต์โดยไม่ต้องNULL
ลูปargc
เดียวwhile
จะทำสิ่งนี้
หากมีการNULL
ต่อท้ายargv
เสมอทำไมเราต้องมีargc
?
"\0"
ไม่เหมือนกับตัวชี้ NULL ( 0
เทียบเท่ากับ NULL ใน C ++)
คำตอบ:
ใช่argv[argc]==NULL
รับประกัน ดูC11 5.1.2.2.1 การเริ่มต้นโปรแกรม (ฉันเน้น)
หากมีการประกาศพารามิเตอร์ของฟังก์ชันหลักจะต้องปฏิบัติตามข้อ จำกัด ต่อไปนี้:
ค่าของ argc จะต้องไม่เป็นค่าลบ argv [argc] จะเป็นตัวชี้โมฆะ
หาก argc
จึงไม่สำคัญ แต่ยังมีประโยชน์ เหนือสิ่งอื่นใดมันช่วยให้ตรวจสอบได้อย่างรวดเร็วว่ามีการส่งผ่านจำนวนอาร์กิวเมนต์ที่ถูกต้องหรือไม่
แก้ไข: คำถามได้รับการแก้ไขให้รวม C ++ n3337 ร่าง3.6.1 ฟังก์ชั่นหลักกล่าวว่า
2 ... argc คือจำนวนอาร์กิวเมนต์ที่ส่งผ่านไปยังโปรแกรมจากสภาพแวดล้อมที่โปรแกรมทำงาน .... ค่าของ argc จะต้องไม่เป็นลบ ค่าของ argv [การ argc] จะเป็น 0
argc
อาจจะค่อนข้างใหญ่เพราะเปลือกจะทำการขยายตัว (ดังนั้นในมีการขยายจากเปลือกก่อนการปฏิบัติการ) ในระบบของฉันฉันสามารถมีได้หลายแสน ls *
*
execve
/bin/ls
argc
argc
เพียงพอเสมอแต่ฉันสามารถนึกถึงสถานการณ์ที่การรับประกันนี้เกี่ยวข้องและจำเป็นได้อย่างแน่นอน +1
argc
คือและเป็นสิ่งที่ดี
ใช่argv[argc]
รับประกันว่าจะเป็นตัวชี้โมฆะ argc
ใช้เพื่อความสะดวก
อ้างคำอธิบายอย่างเป็นทางการจาก C99 Rationale สังเกตคำว่าซ้ำซ้อนตรวจสอบ :
เหตุผลสำหรับมาตรฐานสากล - ภาษาโปรแกรม - C §5.1.2.2.1การเริ่มต้นโปรแกรม
ข้อกำหนด
argc
และargv
เป็นข้อโต้แย้งเพื่อmain
รับรู้การปฏิบัติก่อนหน้านี้อย่างกว้างขวางargv[argc]
จำเป็นต้องเป็นตัวชี้ค่าว่างเพื่อให้การตรวจสอบจุดสิ้นสุดของรายการซ้ำซ้อนและบนพื้นฐานของการปฏิบัติทั่วไป
ด้วยเหตุผลทางประวัติศาสตร์และความเข้ากันได้กับรหัสเก่า ในขั้นต้นไม่มีการรับประกันว่าจะมีตัวชี้ว่างเป็นองค์ประกอบสุดท้ายของอาร์เรย์ argv แต่ argc มีอยู่เสมอ
int main(char *argv[], int argc, ...)
โปรแกรมบางโปรแกรมก็สามารถละเว้นได้argc
เพราะไม่จำเป็นต้องใช้ ตรงข้าม (จำเป็นargc
แต่ไม่argv
) อาจไม่มีประโยชน์ในโปรแกรมจริง
เรา "ต้องการ" เพราะมันจำเป็นตามมาตรฐานต่างๆ
เรามีอิสระที่จะละเว้นค่าทั้งหมด แต่เนื่องจากเป็นพารามิเตอร์แรกของmain
เราจึงต้องมีในรายการพารามิเตอร์ ใน C ++ (และอาจไม่ใช่ภาษา C ที่เป็นมาตรฐาน) คุณสามารถละชื่อพารามิเตอร์เช่นตัวอย่างข้อมูล C ++ (ง่ายต่อการแปลงเป็น C):
#include <stdio.h> // C-compatible include, guarantees puts in global namespace
// program will print contents of argv, one item per line, starting from argv[0]
int main(int /*argc*/, char *argv[]) { // uncomment argc for C
//(void)argc; // uncomment statement for C
for (int i=0; argv[i]; ++i) {
puts(argv[i]);
}
return 0;
}
ในมาตรฐาน C ที่มีการตั้งค่าคำเตือนทั่วไปพารามิเตอร์ที่ไม่ได้ใช้จะสร้างคำเตือนซึ่งสามารถแก้ไขได้โดยคำสั่ง(void)argc;
ที่ทำให้ชื่อถูกใช้โดยไม่ต้องสร้างรหัสใด ๆ
argc
เป็นสิ่งที่ดีที่มีเพราะมิฉะนั้นหลายโปรแกรมจะต้องเดินผ่านพารามิเตอร์เพื่อรับการนับ นอกจากนี้ในภาษาโปรแกรมหลายภาษาที่มีอาร์เรย์ที่มีความยาวไม่มีargc
พารามิเตอร์ใด ๆมีเพียงอาร์เรย์ที่มีรายการ
int argc(char *argv[])
ทำสิ่งนี้อย่างแน่นอน :-))