กฎเกี่ยวกับการใช้ขีดเส้นใต้ในตัวระบุ C ++ คืออะไร


930

เป็นเรื่องปกติใน C ++ ในการตั้งชื่อตัวแปรสมาชิกด้วยคำนำหน้าบางชนิดเพื่อแสดงความจริงว่าเป็นตัวแปรสมาชิกแทนที่จะเป็นตัวแปรหรือพารามิเตอร์ในตัวเครื่อง หากคุณได้มาจากพื้นหลังเอ็มเอฟ, m_fooคุณอาจจะใช้ ฉันเคยเห็นmyFooบ้างเช่นกัน

C # (หรืออาจจะเพียงแค่ .NET) _fooดูเหมือนว่าจะแนะนำให้ใช้เพียงขีดเป็นเช่นเดียวกับใน สิ่งนี้ได้รับอนุญาตจากมาตรฐาน C ++ หรือไม่


3
หน้าคู่มือ glibc เกี่ยวกับที่สามารถพบได้ที่gnu.org/software/libc/manual/html_node/Reserved-Names.htmlแก้ไข: ดูopengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
CesarB

6
เพียงเพื่อให้ทราบว่าการเพิกเฉยต่อกฎเหล่านี้ไม่ได้หมายความว่ารหัสของคุณจะไม่รวบรวมหรือเรียกใช้ แต่เป็นไปได้ว่ารหัสของคุณจะไม่สามารถพกพาไปยังคอมไพเลอร์และเวอร์ชั่นต่าง ๆ ได้เนื่องจากไม่สามารถรับประกันได้ว่าจะไม่มีชื่อ การปะทะกัน ในการสำรองข้อมูลนี้ฉันรู้ว่าการใช้งานระบบสำคัญบางอย่างที่ใช้เป็นแบบแผนการตั้งชื่อ _ ตัวพิมพ์ใหญ่ทุกที่ ที่นั่นไม่มีข้อผิดพลาดเนื่องจากสิ่งนี้ แน่นอนว่ามันเป็นการฝึกฝนที่ไม่ดี
g24l

คำตอบ:


852

กฎ (ซึ่งไม่เปลี่ยนแปลงใน C ++ 11):

  • สงวนไว้ในขอบเขตใด ๆ รวมถึงเพื่อใช้เป็นมาโครการใช้งาน :
    • ตัวระบุที่ขึ้นต้นด้วยขีดล่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่ทันที
    • ตัวระบุที่มีเครื่องหมายขีดล่าง (หรือ "ขีดเส้นใต้คู่")
  • จองในเนมสเปซส่วนกลาง:
    • ตัวระบุที่ขึ้นต้นด้วยขีดล่าง
  • นอกจากนี้ทุกอย่างในstdเนมสเปซจะถูกสงวนไว้ (คุณได้รับอนุญาตให้เพิ่มความเชี่ยวชาญเฉพาะด้านเทมเพลต)

จากมาตรฐาน 2003 C ++:

17.4.3.1.2 ชื่อสากล [lib.global.names]

ชุดชื่อและฟังก์ชั่นบางอย่างถูกสงวนไว้สำหรับการนำไปใช้งานเสมอ:

  • แต่ละชื่อที่มีเครื่องหมายขีดล่างคู่ ( __) หรือขึ้นต้นด้วยเครื่องหมายขีดล่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่ (2.11) สงวนไว้สำหรับการนำไปใช้งานสำหรับการใช้งานใด ๆ
  • แต่ละชื่อที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้สำหรับการนำไปใช้เพื่อใช้เป็นชื่อในโกลบอลเนมสเปซ 165

165)ชื่อดังกล่าวสงวนไว้ใน namespace ::std(17.4.3.1)

เนื่องจาก C ++ เป็นไปตามมาตรฐาน C (1.1 / 2, C ++ 03) และ C99 เป็นการอ้างอิงเชิงบรรทัดฐาน (1.2 / 1, C ++ 03) สิ่งเหล่านี้จึงนำมาใช้เช่นกันจากมาตรฐาน C 1999:

7.1.3 ตัวระบุลิขสิทธิ์

แต่ละส่วนหัวประกาศหรือกำหนดตัวระบุทั้งหมดที่ระบุไว้ใน subclause ที่เกี่ยวข้องและเลือกที่จะประกาศหรือกำหนดตัวระบุที่ระบุไว้ใน subclause เส้นทางไลบรารีในอนาคตที่เกี่ยวข้องและตัวระบุซึ่งสงวนไว้เสมอสำหรับการใช้งานใด ๆ หรือเพื่อใช้เป็นตัวระบุขอบเขตไฟล์

  • ตัวระบุทั้งหมดที่ขึ้นต้นด้วยเครื่องหมายขีดล่างและตัวอักษรตัวพิมพ์ใหญ่หรือขีดล่างอื่นจะถูกสงวนไว้เสมอสำหรับการใช้งานใด ๆ
  • ตัวระบุทั้งหมดที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้เสมอเพื่อใช้เป็นตัวระบุที่มีขอบเขตไฟล์ทั้งในช่องว่างชื่อสามัญและแท็ก
  • แต่ละชื่อแมโครในหนึ่งใน subclauses ต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้สำหรับใช้ตามที่ระบุหากมีส่วนหัวที่เกี่ยวข้องใด ๆ รวมอยู่ด้วย เว้นแต่จะระบุไว้อย่างชัดเจนเป็นอย่างอื่น (ดู 7.1.4)
  • ตัวระบุทั้งหมดที่มีการเชื่อมโยงภายนอกใน subclauses ใด ๆ ดังต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้เสมอเพื่อใช้เป็นตัวระบุที่มีการเชื่อมโยงภายนอก 154
  • ตัวระบุแต่ละตัวที่มีขอบเขตไฟล์อยู่ในรายการย่อยใด ๆ ต่อไปนี้ (รวมถึงทิศทางไลบรารีในอนาคต) จะถูกสงวนไว้สำหรับใช้เป็นชื่อแมโครและเป็นตัวระบุที่มีขอบเขตไฟล์ในพื้นที่ชื่อเดียวกันหากมีส่วนหัวใด ๆ ที่เกี่ยวข้องอยู่ด้วย

ไม่มีการจองตัวระบุอื่น ๆ หากโปรแกรมประกาศหรือกำหนดตัวระบุในบริบทที่สงวนไว้ (นอกเหนือจากที่อนุญาตโดย 7.1.4) หรือกำหนดตัวบ่งชี้ที่สงวนไว้เป็นชื่อแมโครพฤติกรรมจะไม่ได้กำหนดไว้

หากโปรแกรมลบ#undefนิยามแมโครใด ๆ ของตัวระบุในกลุ่มแรกที่ระบุไว้ข้างต้นแสดงว่าพฤติกรรมนั้นไม่ได้กำหนดไว้

154)รายการของตัวระบุลิขสิทธิ์ที่มีการเชื่อมโยงภายนอกรวมerrno, math_errhandling, และsetjmpva_end

อาจมีข้อ จำกัด อื่น ๆ ตัวอย่างเช่นมาตรฐาน POSIX ขอสงวนตัวระบุจำนวนมากที่มีแนวโน้มที่จะแสดงในรหัสปกติ:

  • ชื่อที่ขึ้นต้นด้วยEตัวอักษรตัวใหญ่ตามตัวอักษรหรือตัวพิมพ์ใหญ่:
    • อาจใช้สำหรับชื่อรหัสข้อผิดพลาดเพิ่มเติม
  • ชื่อที่ขึ้นต้นด้วยisหรือtoตามด้วยตัวอักษรตัวเล็ก
    • อาจใช้สำหรับการทดสอบอักขระเพิ่มเติมและฟังก์ชั่นการแปลง
  • ชื่อที่ขึ้นต้นด้วยLC_ตัวอักษรตัวพิมพ์ใหญ่
    • อาจใช้สำหรับมาโครเพิ่มเติมที่ระบุแอตทริบิวต์สถานที่
  • ชื่อของฟังก์ชันทางคณิตศาสตร์ที่มีอยู่ทั้งหมดต่อท้ายด้วยfหรือlถูกสงวนไว้
    • สำหรับฟังก์ชั่นที่เกี่ยวข้องที่ทำงานกับการลอยและอาร์กิวเมนต์คู่ยาวตามลำดับ
  • ชื่อที่ขึ้นต้นด้วยSIGตัวอักษรตัวพิมพ์ใหญ่จะถูกสงวนไว้
    • สำหรับชื่อสัญญาณเพิ่มเติม
  • ชื่อที่ขึ้นต้นด้วยSIG_ตัวอักษรตัวพิมพ์ใหญ่จะถูกสงวนไว้
    • สำหรับการกระทำสัญญาณเพิ่มเติม
  • ชื่อที่ขึ้นต้นด้วยstr, memหรือwcsตามด้วยตัวอักษรตัวเล็กจะถูกสงวนไว้
    • สำหรับฟังก์ชันสตริงและอาร์เรย์เพิ่มเติม
  • ชื่อที่ขึ้นต้นด้วยPRIหรือSCNตามด้วยตัวพิมพ์เล็กหรือXสงวนไว้
    • สำหรับมาโครตัวระบุรูปแบบเพิ่มเติม
  • ชื่อที่ลงท้ายด้วย_tสงวนไว้
    • สำหรับชื่อประเภทเพิ่มเติม

ในขณะที่การใช้ชื่อเหล่านี้เพื่อจุดประสงค์ของคุณในขณะนี้อาจไม่ทำให้เกิดปัญหา แต่จะเพิ่มความเป็นไปได้ที่จะเกิดความขัดแย้งกับเวอร์ชันในอนาคตของมาตรฐานนั้น


โดยส่วนตัวแล้วฉันไม่ได้เริ่มตัวระบุด้วยขีดล่าง ใหม่นอกเหนือจากกฎของฉัน: อย่าใช้ขีดเส้นใต้สองครั้งที่ใดก็ได้ซึ่งเป็นเรื่องง่ายเพราะฉันไม่ค่อยใช้ขีดเส้นใต้

หลังจากทำการวิจัยเกี่ยวกับบทความนี้ฉันไม่ได้จบตัวระบุของฉันอีกต่อไป_t เนื่องจากมันถูกสงวนไว้โดยมาตรฐาน POSIX

กฎเกี่ยวกับตัวระบุที่ลงท้ายด้วย_tทำให้ฉันประหลาดใจมาก ฉันคิดว่านั่นเป็นมาตรฐาน POSIX (ยังไม่แน่ใจ) กำลังมองหาคำอธิบายและบทและบทกวีอย่างเป็นทางการ นี่คือจากคู่มือGNU libtoolซึ่งแสดงรายการชื่อที่สงวนไว้

CesarB ให้ลิงค์ต่อไปนี้ไปยังสัญลักษณ์และPOSIX 2004 ที่สงวนไว้ 'ซึ่งสามารถใช้คำนำหน้าและคำต่อท้ายอื่น ๆ ได้อีกหลายตัว ... POSIX 2008สัญลักษณ์ที่สงวนไว้จะถูกกำหนดไว้ที่นี่ ข้อ จำกัด ค่อนข้างเหมาะสมยิ่งกว่าที่กล่าวไว้ข้างต้น


14
มาตรฐาน C ++ ไม่ได้ "นำเข้า" C อย่างใดอย่างหนึ่งใช่ไหม พวกเขานำเข้าส่วนหัวบางส่วน แต่ไม่ใช่ภาษาโดยรวมหรือกฎการตั้งชื่อเท่าที่ฉันรู้ แต่ใช่คน _t ก็ทำให้ฉันประหลาดใจเช่นกัน แต่เนื่องจากเป็น C จึงสามารถใช้ได้กับ ns ทั่วโลกเท่านั้น ควรจะปลอดภัยที่จะใช้ _t เรียนภายในเป็นฉันอ่านมัน
jalf

27
มาตรฐาน C ++ ไม่ได้ "นำเข้า" มาตรฐาน C มันอ้างอิงมาตรฐาน C การแนะนำไลบรารี C ++ บอกว่า "ห้องสมุดยังให้บริการสิ่งอำนวยความสะดวกต่างๆของห้องสมุด Standard C ด้วย" มันทำเช่นนั้นโดยรวมส่วนหัวของไลบรารี C Standard ที่มีการเปลี่ยนแปลงที่เหมาะสม แต่ไม่ใช่โดย "อิมพอร์ต" มัน มาตรฐาน C ++ มีชุดของกฎที่อธิบายชื่อที่สงวนไว้ หากชื่อที่สงวนไว้ใน C ควรจองไว้ใน C ++ นั่นคือสถานที่ที่จะกล่าวสิ่งนี้ แต่มาตรฐาน C ++ ไม่ได้พูดอย่างนั้น ดังนั้นฉันไม่เชื่อว่าสิ่งที่สงวนไว้ใน C สงวนไว้ใน C ++ - แต่ฉันอาจผิด
Johannes Schaub - litb

8
นี่คือสิ่งที่ฉันพบเกี่ยวกับปัญหา "_t": n1256 (C99 TC3) พูดว่า: "ชื่อ Typedef เริ่มต้นด้วย int หรือ uint และลงท้ายด้วย _t" ถูกสงวนไว้ ฉันคิดว่ายังคงอนุญาตให้ใช้ชื่ออย่าง "foo_t" - แต่ฉันคิดว่า POSIX นั้นสงวนไว้แล้ว
Johannes Schaub - litb

59
ดังนั้น 'เผื่อ' ถูกสงวนไว้โดย POSIX เมื่อเริ่มต้นด้วย 'ถึง' + ตัวอักษรตัวเล็ก? ฉันเดิมพันรหัสจำนวนมากผิดกฎนี้!
Sjoerd

23
@ LokiAstari, " มาตรฐาน C ++ นั้นถูกกำหนดในแง่ของมาตรฐาน C โดยพื้นฐานแล้วมันบอกว่า C ++ คือ C ที่มีความแตกต่างและส่วนเพิ่มเติมเหล่านี้ " ไร้สาระ! C ++ อ้างอิงมาตรฐาน C ใน [basic.fundamental] และไลบรารีเท่านั้น หากสิ่งที่คุณพูดเป็นจริง C ++ จะพูดเช่นนั้น_Boolและ_Imaginaryไม่มีอยู่ใน C ++ ภาษา C ++ มีการกำหนดไว้อย่างชัดเจนไม่ใช่ในแง่ของ "การแก้ไข" ถึง C มิฉะนั้นมาตรฐานอาจสั้นกว่านี้มาก!
Jonathan Wakely

198

กฎเพื่อหลีกเลี่ยงการชนกันของชื่อมีทั้งในมาตรฐาน C ++ (ดูหนังสือ Stroustrup) และกล่าวถึงโดยปรมาจารย์ C ++ (ซัทเทอร์ ฯลฯ )

กฎส่วนบุคคล

เพราะฉันไม่ต้องการที่จะจัดการกับกรณีและต้องการกฎง่ายๆฉันได้ออกแบบกฎส่วนตัวที่เรียบง่ายและถูกต้อง:

เมื่อตั้งชื่อสัญลักษณ์คุณจะหลีกเลี่ยงการชนกับคอมไพเลอร์ / OS / ไลบรารีมาตรฐานหากคุณ:

  • ห้ามเริ่มสัญลักษณ์ด้วยเครื่องหมายขีดเส้นใต้
  • ไม่เคยตั้งชื่อสัญลักษณ์ด้วยเครื่องหมายขีดล่างสองตัวที่อยู่ข้างใน

แน่นอนว่าการใส่โค้ดของคุณในเนมสเปซที่ไม่เหมือนใครช่วยหลีกเลี่ยงการชนเช่นกัน (แต่จะไม่ป้องกันมาโครที่ชั่วร้าย)

ตัวอย่างบางส่วน

(ฉันใช้มาโครเพราะเป็นสัญลักษณ์ของรหัส C / C ++ มากขึ้น แต่อาจเป็นอะไรก็ได้ตั้งแต่ชื่อตัวแปรไปจนถึงชื่อคลาส)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

แยกจากร่าง C ++ 0x

จากไฟล์n3242.pdf (ฉันคาดว่าข้อความมาตรฐานขั้นสุดท้ายจะคล้ายกัน):

17.6.3.3.2 ชื่อสากล [global.names]

ชุดชื่อและฟังก์ชั่นบางอย่างถูกสงวนไว้สำหรับการนำไปใช้งานเสมอ:

- แต่ละชื่อที่มีเครื่องหมายขีดล่าง _ _ หรือขึ้นต้นด้วยเครื่องหมายขีดล่างตามด้วยตัวอักษรตัวพิมพ์ใหญ่ (2.12) สงวนไว้สำหรับการนำไปใช้งานสำหรับการใช้งานใด ๆ

- แต่ละชื่อที่ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้สำหรับการนำไปใช้งานเพื่อใช้เป็นชื่อในเนมสเปซส่วนกลาง

แต่ยัง:

17.6.3.3.5 ส่วนต่อท้ายตามตัวอักษรที่ผู้ใช้กำหนด [usrlit.suffix]

ตัวระบุคำต่อท้ายตัวอักษรที่ไม่ได้ขึ้นต้นด้วยขีดล่างจะถูกสงวนไว้สำหรับการกำหนดมาตรฐานในอนาคต

ประโยคสุดท้ายนี้ทำให้เกิดความสับสนเว้นแต่คุณจะพิจารณาว่าชื่อที่ขึ้นต้นด้วยขีดเส้นใต้หนึ่งตัวและตามด้วยตัวพิมพ์เล็กจะเป็น Ok หากไม่ได้กำหนดไว้ในเนมสเปซส่วนกลาง ...


9
@Meysam: __WRONG_AGAIN__มีขีดล่างที่ต่อเนื่องกันสองอัน (สองอันที่จุดเริ่มต้นและอีกสองอันท้าย) ดังนั้นสิ่งนี้ผิดตามมาตรฐาน
paercebal

8
@ BЈовић: WRONG__WRONGมีขีดล่างที่ต่อเนื่องกันสองอัน (สองตัวตรงกลาง) ดังนั้นนี่เป็นสิ่งที่ผิดตามมาตรฐาน
paercebal

2
การวางโค้ดของคุณในเนมสเปซที่ไม่ซ้ำใครช่วยหลีกเลี่ยงการชนเช่นกัน แต่นี่ยังไม่เพียงพอเนื่องจากตัวระบุอาจชนกับคำหลักโดยไม่คำนึงถึงขอบเขต (เช่น__attribute__สำหรับ GCC)
Ruslan

1
ทำไมถึงมีปัญหาในการมีขีดเส้นใต้สองอันติดต่อกันตรงกลางตามมาตรฐาน? ตัวต่อท้ายที่ผู้ใช้กำหนดเองใช้กับค่าตามตัวอักษรเช่น1234567Lหรือ4.0f; IIRC สิ่งนี้อ้างถึง ohttp: //en.cppreference.com/w/cpp/language/user_literal
Jason S

2
Why is there any problem of having two consecutive underscores in the middle according to the standard?เพราะมาตรฐานบอกว่าสิ่งเหล่านั้นสงวนไว้ นี่ไม่ใช่คำแนะนำเกี่ยวกับสไตล์ที่ดีหรือไม่ดี มันเป็นการตัดสินใจจากมาตรฐาน ทำไมพวกเขาตัดสินใจเรื่องนี้ ฉันเดาว่าคอมไพเลอร์ตัวแรกใช้การประชุมแบบนี้อย่างไม่เป็นทางการมาก่อนมาตรฐาน
paercebal

38

จากMSDN :

การใช้อักขระขีดล่างขีดล่างสองตัว (__) ที่จุดเริ่มต้นของตัวระบุหรือขีดเส้นใต้นำหน้าเดียวตามด้วยตัวพิมพ์ใหญ่สงวนไว้สำหรับการใช้งาน C ++ ในขอบเขตทั้งหมด คุณควรหลีกเลี่ยงการใช้เครื่องหมายขีดเส้นใต้อันใดอันหนึ่งตามด้วยตัวอักษรตัวเล็กสำหรับชื่อที่มีขอบเขตไฟล์เนื่องจากอาจขัดแย้งกับตัวระบุที่สงวนไว้ในปัจจุบันหรือในอนาคต

ซึ่งหมายความว่าคุณสามารถใช้ขีดล่างเดียวเป็นส่วนนำหน้าตัวแปรสมาชิกได้ตราบใดที่มันตามด้วยตัวอักษรตัวพิมพ์เล็ก

เห็นได้ชัดว่านี่มาจากมาตรา 17.4.3.1.2 ของมาตรฐาน C ++ แต่ฉันไม่สามารถหาแหล่งต้นฉบับสำหรับมาตรฐานออนไลน์แบบเต็มได้

ดูคำถามนี้ด้วย


2
ฉันพบข้อความที่คล้ายกันใน n3092.pdf (ร่างมาตรฐาน C ++ 0x) ที่ส่วน: "17.6.3.3.2 ชื่อสากล"
paercebal

7
น่าสนใจว่านี่เป็นคำตอบเดียวที่มีคำตอบที่ตรงและกระชับกับคำถาม
ไฮด์

9
@hyde: อันที่จริงมันไม่ได้เพราะมันข้ามกฎเพื่อไม่ให้มีตัวบ่งชี้ใด ๆ ที่มีขีดเส้นนำในเนมสเปซส่วนกลาง ดูคำตอบของโรเจอร์ ฉันจะระมัดระวังการอ้างอิงเอกสาร MS VC ในฐานะผู้มีอำนาจในมาตรฐาน C ++
sbi

@sbi ฉันหมายถึง "คุณสามารถใช้ขีดเส้นใต้เดียวเป็นคำนำหน้าตัวแปรสมาชิกตราบใดที่มันตามด้วยตัวอักษรพิมพ์เล็ก"ในคำตอบนี้ซึ่งตอบคำถามเกี่ยวกับข้อความคำถามโดยตรงและรัดกุมโดยไม่จมน้ำ ในกำแพงข้อความ
hyde

5
ครั้งแรกฉันยังคงพิจารณาการขาดคำใบ้ใด ๆ ว่ากฎเดียวกันไม่สามารถใช้กับเนมสเปซส่วนกลางที่ล้มเหลวได้ มีอะไรเลวร้าย แต่เป็นที่ขีดที่อยู่ติดกันเป็นสิ่งต้องห้ามไม่ได้เป็นเพียงจุดเริ่มต้นของ แต่ที่ใดก็ได้ในตัวระบุ ดังนั้นคำตอบนี้ไม่เพียง แต่ละเว้นความจริง แต่จริง ๆ แล้วเรียกร้องอย่างผิด ๆ อย่างน้อยหนึ่งข้อ ดังที่ฉันได้กล่าวไปแล้วการอ้างถึงเอกสาร MSVC เป็นสิ่งที่ฉันจะไม่ทำนอกจากคำถามจะเกี่ยวกับ VC เท่านั้น
sbi

25

สำหรับส่วนอื่น ๆ ของคำถามเป็นเรื่องปกติที่จะใส่เครื่องหมายขีดล่างที่ส่วนท้ายของชื่อตัวแปรเพื่อไม่ขัดแย้งกับสิ่งใดภายใน

ฉันทำสิ่งนี้แม้ในคลาสและเนมสเปซเพราะฉันต้องจำเพียงกฎเดียวเท่านั้น (เทียบกับ "ที่ส่วนท้ายของชื่อในขอบเขตทั่วโลกและจุดเริ่มต้นของชื่อทุกที่")


2

ใช่ขีดล่างสามารถใช้ได้ทุกที่ในตัวระบุ ฉันเชื่อว่ากฎคือ: ใด ๆ ของ az, AZ, _ ในตัวอักษรตัวแรกและที่ 0-9 สำหรับตัวละครต่อไปนี้

คำนำหน้าขีดเส้นใต้มีอยู่ทั่วไปในรหัส C - ขีดเส้นใต้เดียวหมายความว่า "ส่วนตัว" และขีดล่างคู่มักจะสงวนไว้สำหรับการใช้งานโดยคอมไพเลอร์


3
มันเป็นเรื่องธรรมดาในห้องสมุด พวกเขาไม่ควรพบได้บ่อยในรหัสผู้ใช้
มาร์ตินยอร์ค

43
คนไม่เขียนห้องสมุดใน C, คุณรู้ว่า
John Millikin

7
"ใช่ขีดล่างอาจใช้ที่ใดก็ได้ในตัวระบุ" สิ่งนี้ผิดสำหรับตัวระบุทั่วโลก ดูคำตอบของโรเจอร์
sbi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.