คำถามติดแท็ก c

C เป็นภาษาโปรแกรมทั่วไปที่ใช้สำหรับการเขียนโปรแกรมระบบ (ระบบปฏิบัติการและฝังตัว), ห้องสมุด, เกมและข้ามแพลตฟอร์ม แท็กนี้ควรใช้กับคำถามทั่วไปที่เกี่ยวข้องกับภาษา C ตามที่กำหนดไว้ในมาตรฐาน ISO 9899 (เวอร์ชันล่าสุด 9899: 2018 เว้นแต่ระบุไว้เป็นอย่างอื่น - นอกจากนี้ยังติดแท็กคำขอเฉพาะรุ่นด้วย c89, c99, c11 ฯลฯ ) C แตกต่างจาก C ++ และไม่ควรใช้ร่วมกับแท็ก C ++ หากไม่มีเหตุผล


12
คำสั่งที่มีประโยชน์ / มีประโยชน์มากที่สุดสำหรับ gdb ดีบักเกอร์ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา คุณสามารถโพสต์คำสั่งที่มีประโยชน์และมีประโยชน์ที่สุดของคุณในขณะที่คุณเรียกใช้ดีบักเกอร์เช่น gdb หรือ dbx
138 c  unix  gdb  debugging  dbx 

5
การเขียนโปรแกรมเพื่อรับมือกับข้อผิดพลาดของ I / O ทำให้การเขียนที่หายไปบน Linux
TL; DR: ถ้าเคอร์เนล Linux สูญเสียการเขียน I / O ที่บัฟเฟอร์แล้วมีวิธีใดบ้างที่แอปพลิเคชันจะค้นหา? ฉันรู้ว่าคุณต้องfsync()แฟ้ม (และไดเรกทอรีแม่ของมัน) เพื่อความทนทาน คำถามคือหากเคอร์เนลสูญเสียบัฟเฟอร์สกปรกที่รอการเขียนเนื่องจากข้อผิดพลาด I / O แอปพลิเคชันสามารถตรวจพบสิ่งนี้และกู้คืนหรือยกเลิก? คิดว่าแอ็พพลิเคชันฐานข้อมูล ฯลฯ ที่ลำดับการเขียนและความทนทานในการเขียนมีความสำคัญ เขียนหายไป? อย่างไร? ลินุกซ์เคอร์เนลสามารถป้องกันชั้นภายใต้สถานการณ์บางแพ้บัฟเฟอร์การร้องขอ I / O ที่ได้รับการส่งเรียบร้อยแล้วโดยwrite(), pwrite()ฯลฯ ด้วยข้อผิดพลาดเช่น: Buffer I/O error on device dm-0, logical block 12345 lost page write due to I/O error on dm-0 (ดูend_buffer_write_sync(...)และend_buffer_async_write(...)ในfs/buffer.c ) ในเมล็ดที่ใหม่กว่าข้อผิดพลาดจะมี …
138 c  linux  linux-kernel  posix 

2
ทำไมการจัดสรรเริ่มต้น C ++ จึงมีขนาดใหญ่กว่า C มาก?
เมื่อใช้รหัสเดียวกันการเปลี่ยนคอมไพเลอร์ (จากคอมไพเลอร์ C เป็นคอมไพเลอร์ C ++) จะเปลี่ยนจำนวนหน่วยความจำที่จัดสรร ฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนี้และต้องการที่จะเข้าใจมากกว่านี้ จนถึงการตอบสนองที่ดีที่สุดที่ฉันได้รับคือ "อาจเป็นสตรีม I / O" ซึ่งไม่ได้อธิบายมากและทำให้ฉันสงสัยเกี่ยวกับ "คุณไม่จ่ายเงินสำหรับสิ่งที่คุณไม่ได้ใช้" แง่มุมของ C ++ ฉันใช้คอมไพเลอร์ Clang และ GCC เวอร์ชัน 7.0.1-8 และ 8.3.0-6 ตามลำดับ ระบบของฉันทำงานบน Debian 10 (Buster) เวอร์ชันล่าสุด มาตรฐานจะทำผ่าน Valgrind Massif #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } รหัสที่ใช้ไม่เปลี่ยนแปลง แต่ไม่ว่าฉันจะคอมไพล์เป็น C หรือเป็น C …
138 c++  c  benchmarking 

6
จะโทร C จาก Swift ได้อย่างไร
มีวิธีเรียก C รูทีนจาก Swift หรือไม่? ไลบรารี iOS / Apple จำนวนมากเป็นแบบ C เท่านั้นและฉันยังต้องการโทรหาสิ่งเหล่านี้ ตัวอย่างเช่นฉันต้องการเรียกไลบรารีรันไทม์ objc จาก swift โดยเฉพาะอย่างยิ่งคุณเชื่อมโยงส่วนหัว iOS C ได้อย่างไร
138 c  swift 


7
ขนาดบิตยาวของ Windows 64 บิตคือเท่าใด
จะไม่นานที่ผ่านมามีคนบอกผมว่าlongไม่ได้ 64 บิต 64 intเครื่องบิตและฉันควรใช้ สิ่งนี้ไม่สมเหตุสมผลสำหรับฉัน ฉันเคยเห็นเอกสาร (เช่นที่อยู่ในเว็บไซต์อย่างเป็นทางการของ Apple) บอกว่าlongเป็น 64 บิตเมื่อรวบรวมสำหรับ CPU 64 บิต ฉันค้นหาสิ่งที่อยู่บน Windows 64 บิตและพบว่า Windows: longและintยังคงมีความยาว 32 บิตและมีการกำหนดชนิดข้อมูลใหม่พิเศษสำหรับจำนวนเต็ม 64 บิต (จากhttp://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 ) ฉันควรใช้อะไร ฉันควรกำหนดสิ่งที่ต้องการuw, sw((un) ความกว้างที่มีการเซ็นlongชือ) เป็นถ้าไม่ได้อยู่ใน Windows และควรตรวจสอบบิตซีพียูเป้าหมายหรือไม่
137 c++  c  windows  64-bit  porting 

9
เหตุใดฟังก์ชัน C จึงไม่สามารถเปลี่ยนชื่อได้
ฉันมีการสัมภาษณ์เมื่อเร็ว ๆ นี้และมีคำถามหนึ่งที่ถามคือการใช้extern "C"รหัส C ++ คืออะไร ฉันตอบว่ามันคือการใช้ฟังก์ชั่น C ในรหัส C ++ เนื่องจาก C ไม่ใช้ name-mangling ฉันถูกถามว่าทำไม C ถึงไม่ใช้ชื่อเล่นและพูดตามตรงว่าฉันไม่สามารถตอบได้ ฉันเข้าใจว่าเมื่อคอมไพเลอร์ C ++ รวบรวมฟังก์ชันมันตั้งชื่อพิเศษให้กับฟังก์ชันเป็นหลักเนื่องจากเราสามารถมีฟังก์ชันที่มีชื่อเดียวกันมากเกินไปใน C ++ ซึ่งต้องได้รับการแก้ไขในเวลาคอมไพล์ ใน C ชื่อของฟังก์ชันจะยังคงเหมือนเดิมหรืออาจจะมีเครื่องหมาย _ นำหน้า คำถามของฉันคือ: เกิดอะไรขึ้นกับการอนุญาตให้คอมไพเลอร์ C ++ ทำลายฟังก์ชัน C ด้วย ฉันจะเดาว่ามันไม่สำคัญว่าคอมไพเลอร์จะตั้งชื่ออะไรให้กับพวกเขา เราเรียกฟังก์ชันในลักษณะเดียวกันในภาษา C และ C ++
137 c++  c  name-mangling  extern-c 

9
ฟังก์ชันวนซ้ำสามารถอยู่ในบรรทัดได้หรือไม่?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } ขณะที่ฉันกำลังอ่านสิ่งนี้พบว่าโค้ดด้านบนจะนำไปสู่ ​​"การรวบรวมแบบไม่มีที่สิ้นสุด" หากไม่ได้รับการจัดการโดยคอมไพเลอร์อย่างถูกต้อง คอมไพลเลอร์ตัดสินใจอย่างไรว่าจะอินไลน์ฟังก์ชันหรือไม่?

9
นิยามโครงสร้างอ้างอิงตนเอง?
ฉันไม่ได้เขียน C มานานมากแล้วดังนั้นฉันจึงไม่แน่ใจว่าฉันควรจะทำสิ่งที่เรียกซ้ำเหล่านี้อย่างไร ... ฉันต้องการให้แต่ละเซลล์มีเซลล์อื่น แต่ฉันได้รับข้อผิดพลาด บรรทัด "field" child "มีประเภทที่ไม่สมบูรณ์" ว่าไง? typedef struct Cell { int isParent; Cell child; } Cell;
137 c  recursion  struct  typedef 

12
อะไรคือประโยชน์ของการยกเลิกถ้า…อื่นถ้าสร้างด้วยประโยคอื่น?
องค์กรของเรามีกฎการเข้ารหัสที่ต้องการ (ไม่มีคำอธิบายใด ๆ ) ที่: ถ้า…อื่นถ้าการสร้างควรถูกยกเลิกด้วยประโยคอื่น ตัวอย่างที่ 1: if ( x < 0 ) { x = 0; } /* else not needed */ ตัวอย่างที่ 2: if ( x < 0 ) { x = 0; } else if ( y < 0 ) { x = 3; } else …
136 c  misra 

12
แพลตฟอร์มใดมีสิ่งอื่นที่ไม่ใช่ถ่าน 8 บิต
ทุกขณะนี้แล้วคนอื่นที่ใช้จุดเพื่อออกว่าchar(aka 'ไบต์') ไม่จำเป็นต้องเป็น 8 บิต ดูเหมือนว่า 8 บิตcharนั้นเกือบจะเป็นสากล ฉันจะคิดว่าสำหรับแพลตฟอร์มหลักจำเป็นต้องมี 8 บิตcharเพื่อให้แน่ใจว่ามีศักยภาพในตลาด ทั้งในตอนนี้และในอดีตแพลตฟอร์มใดที่ใช้charไม่ได้เป็น 8 บิตและทำไมพวกเขาถึงแตกต่างจาก "ปกติ" 8 บิต เมื่อเขียนโค้ดและคิดถึงการสนับสนุนข้ามแพลตฟอร์ม (เช่นสำหรับไลบรารีที่ใช้งานทั่วไป) สิ่งที่ควรคำนึงถึงในการให้แพลตฟอร์มที่ไม่ใช่ non-8-bit charคืออะไร ในอดีตที่ผ่านมาฉันได้พบกับ Analog Devices DSP บางตัวซึ่งcharเป็น 16 บิต DSP เป็นบิตของสถาปัตยกรรมเฉพาะที่ฉันคิดว่า (จากนั้นอีกครั้งในขณะที่แอสเซมเบลอร์ที่เขียนด้วยมือสามารถเอาชนะสิ่งที่คอมไพเลอร์ C ที่มีอยู่สามารถทำได้ดังนั้นฉันจึงไม่ได้รับประสบการณ์มากกับ C บนแพลตฟอร์มนั้น)
136 c++  c  cross-platform 

18
ใครจะใช้สหภาพเมื่อใด เป็นส่วนที่เหลือจากวัน C-only หรือไม่?
ฉันได้เรียนรู้ แต่ไม่ได้เข้าร่วมสหภาพ ข้อความ C หรือ C ++ ทุกข้อความที่ฉันผ่านแนะนำพวกเขา (บางครั้งก็ผ่านไป) แต่พวกเขามักจะให้ตัวอย่างที่เป็นประโยชน์น้อยมากว่าทำไมถึงใช้มัน สหภาพแรงงานจะมีประโยชน์ในกรณีที่ทันสมัย ​​(หรือแม้กระทั่งมรดก) เมื่อใด การคาดเดาเพียงสองข้อของฉันคือการเขียนโปรแกรมไมโครโปรเซสเซอร์เมื่อคุณมีพื้นที่ จำกัด มากในการทำงานหรือเมื่อคุณพัฒนา API (หรือสิ่งที่คล้ายกัน) และคุณต้องการบังคับให้ผู้ใช้ปลายทางมีเพียงอินสแตนซ์เดียวของวัตถุ / ประเภทต่างๆที่ ครั้งหนึ่ง. สองคนนี้เดาได้ใกล้เคียงกันหรือเปล่า?
136 c++  c  unions 

3
LLVM เทียบกับเสียงดังบน OS X
ฉันมีคำถามเกี่ยวกับ llvm, clang และ gcc บน OS X ความแตกต่างระหว่าง llvm-gcc 4.2, llvm 2.0 และ clang คืออะไร? ฉันรู้ว่าพวกเขาทั้งหมดสร้างขึ้นจาก llvm แต่มันแตกต่างกันอย่างไร? นอกจากคอมไพล์ได้เร็วขึ้นแล้ว llvm มีข้อดีกว่า gcc อย่างไร?
136 c++  c  gcc  llvm  clang 

5
ไม่เข้าใจวิธีคำนวณกำลังสองของตัวเลขนี้
ฉันพบฟังก์ชันที่คำนวณกำลังสองของตัวเลข: int p(int n) { int a[n]; //works on C99 and above return (&a)[n] - a; } ก็จะส่งกลับค่า n 2 คำถามคือมันทำได้อย่างไร? หลังจากการทดสอบเล็ก ๆ น้อย ๆ ผมพบว่าระหว่าง(&a)[k]และ(&a)[k+1]เป็น/sizeof(a) sizeof(int)ทำไมถึงเป็นเช่นนั้น?

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