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

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

19
กำลังตรวจจับ #includes ที่ฟุ่มเฟือยใน C / C ++?
ฉันมักจะพบว่าส่วนหัวของไฟล์มีขนาดใหญ่ขึ้นเรื่อย ๆ ตลอดเวลา แต่ก็ไม่เคยเล็กลง ตลอดอายุการใช้งานของคลาสไฟล์ต้นฉบับอาจมีการย้ายและถูกปรับโครงสร้างใหม่และเป็นไปได้มากที่มีจำนวนไม่มาก#includesที่ไม่จำเป็นต้องอยู่ที่นั่นอีกต่อไป ปล่อยให้พวกเขามีเพียงเวลาในการรวบรวมและเพิ่มการพึ่งพาการรวบรวมที่ไม่จำเป็น การพยายามคิดให้ได้ว่าอะไรที่ยังต้องการอยู่นั้นค่อนข้างน่าเบื่อ มีเครื่องมือบางชนิดที่สามารถตรวจจับคำสั่ง #include ที่ฟุ่มเฟือยและแนะนำเครื่องมือที่ฉันสามารถลบได้อย่างปลอดภัยหรือไม่? ผ้าสำลีทำสิ่งนี้ได้ไหม?

19
การคูณและการหารโดยใช้โอเปอเรเตอร์กะใน C เร็วขึ้นจริงหรือ
การคูณและการหารสามารถทำได้โดยใช้ตัวดำเนินการบิตตัวอย่างเช่น i*2 = i<<1 i*3 = (i<<1) + i; i*10 = (i<<3) + (i<<1) และอื่น ๆ จริง ๆ แล้วมันเร็วกว่าการใช้พูด(i<<3)+(i<<1)เพื่อคูณกับ 10 กว่าการใช้i*10โดยตรงหรือไม่ มีอินพุตอะไรบ้างที่ไม่สามารถคูณหรือหารด้วยวิธีนี้ได้?

10
C / C ++ รวมถึงลำดับไฟล์ส่วนหัว
คำสั่งใดควรรวมไฟล์ไว้เช่นอะไรคือสาเหตุของการรวมส่วนหัวหนึ่งหน้าไว้ด้วยกัน ตัวอย่างเช่นไฟล์ระบบ, STL และ Boost ไปก่อนหรือหลังไฟล์รวมในระบบหรือไม่
288 c++  c 

17
ทำไมฉันถึงได้รับข้อผิดพลาดในการแบ่งส่วนเมื่อเขียนถึง“ char * s” ที่เริ่มต้นด้วยตัวอักษรสตริง แต่ไม่ใช่“ char s []”
รหัสต่อไปนี้ได้รับ seg ข้อผิดพลาดในบรรทัด 2: char *str = "string"; str[0] = 'z'; // could be also written as *str = 'z' printf("%s\n", str); ขณะนี้ใช้งานได้ดีอย่างสมบูรณ์: char str[] = "string"; str[0] = 'z'; printf("%s\n", str); ทดสอบกับ MSVC และ GCC

2
ความแตกต่างระหว่างการใช้ Makefile และ CMake เพื่อคอมไพล์โค้ด
ฉันใช้รหัสใน C / C ++ และใช้ Makefile (GNU) เพื่อรวบรวมรหัส ฉันสามารถทำเช่นเดียวกันกับ CMake และรับ MakeFile อย่างไรก็ตามความแตกต่างระหว่างการใช้ Makefile และ CMake เพื่อรวบรวมรหัสคืออะไร?
288 c++  c  makefile  cmake 

8
ทำไม strlen ของ glibc จึงจำเป็นต้องมีความซับซ้อนในการทำงานอย่างรวดเร็ว
ฉันดูstrlenรหัสที่นี่และสงสัยว่าการเพิ่มประสิทธิภาพที่ใช้ในรหัสนั้นจำเป็นจริง ๆ หรือไม่ ตัวอย่างเช่นทำไมบางอย่างจะไม่เหมือนงานต่อไปนี้ดีหรือดีกว่า unsigned long strlen(char s[]) { unsigned long i; for (i = 0; s[i] != '\0'; i++) continue; return i; } รหัสเรียบง่ายกว่าและดีกว่าสำหรับการรวบรวมเพื่อเพิ่มประสิทธิภาพหรือไม่ โค้ดของstrlenหน้าหลังลิงค์มีลักษณะดังนี้: /* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Torbjorn …

20
เขียนแอปพลิเคชันใน C หรือ C ++ สำหรับ Android หรือไม่ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันกำลังพยายามพัฒนา / ย้ายเกมไปยัง Android แต่อยู่ใน C และ Android รองรับ Java แต่ฉันแน่ใจว่าต้องมีวิธีในการรับแอป C ที่นั่นทุกคนรู้วิธีที่จะทำสิ่งนี้ให้สำเร็จหรือไม่
286 c++  c  android 

12
การห่อไลบรารี C ใน Python: C, Cython หรือ ctypes?
ฉันต้องการเรียกไลบรารี C จากแอปพลิเคชัน Python ฉันไม่ต้องการห่อทั้ง API เฉพาะฟังก์ชันและประเภทข้อมูลที่เกี่ยวข้องกับกรณีของฉัน ตามที่เห็นฉันมีสามตัวเลือก: สร้างโมดูลส่วนขยายจริงใน C. อาจเป็นไปได้มากเกินไปและฉันยังต้องการหลีกเลี่ยงค่าใช้จ่ายในการเรียนรู้การเขียนส่วนขยาย ใช้Cythonเพื่อแสดงส่วนที่เกี่ยวข้องจาก C library ไปยัง Python ทำสิ่งทั้งหมดใน Python ctypesเพื่อใช้สื่อสารกับไลบรารีภายนอก ฉันไม่แน่ใจว่า 2) หรือ 3) เป็นตัวเลือกที่ดีกว่าหรือไม่ ข้อได้เปรียบของ 3) คือctypesส่วนหนึ่งของไลบรารีมาตรฐานและโค้ดผลลัพธ์จะเป็น Python แท้ๆ - ถึงแม้ว่าฉันไม่แน่ใจว่าประโยชน์นั้นใหญ่เพียงใด มีข้อดี / ข้อเสียมากกว่าทั้งสองทางเลือกหรือไม่? คุณแนะนำวิธีใด แก้ไข:ขอบคุณสำหรับคำตอบทั้งหมดของคุณพวกเขาให้ทรัพยากรที่ดีสำหรับทุกคนที่ต้องการทำสิ่งที่คล้ายกัน แน่นอนว่าการตัดสินใจยังคงต้องทำในกรณีเดียว - ไม่มีใครตอบ "นี่คือสิ่งที่ถูกต้อง" สำหรับกรณีของฉันเองฉันอาจจะไปกับ ctypes แต่ฉันก็ตั้งตารอที่จะลอง Cython ในโครงการอื่น เมื่อไม่มีคำตอบที่แท้จริงเพียงคำเดียวการยอมรับคำตอบก็ค่อนข้างเป็นการสุ่ม ฉันเลือกคำตอบของ FogleBird เพราะให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับ ctypes …
284 python  c  ctypes  cython 

18
เหตุผลของการยกเลิกสตริงเป็นโมฆะคืออะไร?
เท่าที่ฉันรัก C และ C ++ ฉันไม่สามารถช่วย แต่เกาหัวของฉันในการเลือกสตริงที่สิ้นสุดด้วยค่า null: มีความยาวนำหน้าสตริง (เช่น Pascal) ที่มีอยู่ก่อนหน้า C สตริงที่มีคำนำหน้าความยาวทำให้อัลกอริทึมหลายอย่างเร็วขึ้นโดยอนุญาตให้ค้นหาความยาวของเวลาคงที่ สตริงที่มีคำนำหน้าความยาวทำให้ยากต่อการทำให้เกิดข้อผิดพลาดบัฟเฟอร์เกิน แม้บนเครื่อง 32 บิตหากคุณอนุญาตให้สตริงเป็นขนาดของหน่วยความจำที่มีอยู่สตริงที่ขึ้นต้นความยาวจะมีความกว้างเพียงสามไบต์กว้างกว่าสตริงที่สิ้นสุดด้วยค่า null บนเครื่อง 16 บิตนี่เป็นไบต์เดียว บนเครื่อง 64 บิต 4GB เป็นขีดจำกัดความยาวของสตริงที่เหมาะสม แต่แม้ว่าคุณต้องการขยายให้มีขนาดของคำว่าเครื่องเครื่อง 64 บิตมักจะมีหน่วยความจำเพียงพอที่จะทำให้อาร์กิวเมนต์ที่เจ็ดมีค่าเพิ่มขึ้นอีกเจ็ดไบต์ ฉันรู้ว่ามาตรฐาน C ดั้งเดิมเขียนขึ้นสำหรับเครื่องที่ไม่ดีอย่างบ้าคลั่ง (ในแง่ของหน่วยความจำ) แต่อาร์กิวเมนต์ประสิทธิภาพไม่ได้ขายที่นี่ ค่อนข้างทุกภาษาอื่น ๆ (เช่น Perl, Pascal, Python, Java, C #, ฯลฯ ) ใช้สตริงคำนำหน้าความยาว ภาษาเหล่านี้มักจะเอาชนะ C ในมาตรฐานการจัดการสตริงเพราะพวกเขามีประสิทธิภาพมากขึ้นด้วยสตริง …
281 c++  c  string  null-terminated 

4
กาลครั้งหนึ่งเมื่อ> เร็วกว่า <…เดี๋ยวก่อนอะไรนะ?
ฉันกำลังอ่านบทแนะนำ OpenGL ที่ยอดเยี่ยม มันยอดเยี่ยมมากเชื่อใจฉัน หัวข้อที่ฉันอยู่ในขณะนี้คือ Z-buffer นอกเหนือจากการอธิบายว่ามันคืออะไรผู้เขียนกล่าวว่าเราสามารถทำการทดสอบเชิงลึกที่กำหนดเองเช่น GL_LESS, GL_ALWAYS และอื่น ๆ นอกจากนี้เขายังอธิบายว่าความหมายที่แท้จริงของค่าความลึก ที่กำหนดเอง ฉันเข้าใจจนถึง แล้วผู้เขียนก็บอกว่ามีอะไรที่ไม่น่าเชื่อ: ช่วง zNear สามารถมากกว่าช่วง zFar; ถ้าเป็นเช่นนั้นค่าพื้นที่หน้าต่างจะถูกย้อนกลับในแง่ของสิ่งที่ถือว่าใกล้เคียงที่สุดหรือไกลที่สุดจากผู้ชม ก่อนหน้านี้ได้มีการกล่าวว่าค่า Z- ช่องว่างของหน้าต่างอยู่ใกล้ที่สุดและ 1 มากที่สุด อย่างไรก็ตามหากค่าคลิปพื้นที่ Z ของเราถูกลบความลึก 1 จะอยู่ใกล้กับมุมมองมากที่สุดและความลึกของ 0 จะใกล้เคียงที่สุด แต่ถ้าเราพลิกทิศทางของการทดสอบความลึก (GL_LESS ถึง GL_GREATER ฯลฯ ) เราจะได้ผลลัพธ์เดียวกัน มันเป็นเพียงแค่การประชุมเท่านั้น อันที่จริงการพลิกเครื่องหมายของ Z และการทดสอบเชิงลึกนั้นครั้งหนึ่งเคยเป็นการเพิ่มประสิทธิภาพที่สำคัญสำหรับเกมจำนวนมาก ถ้าฉันเข้าใจอย่างถูกต้องฉลาดหลักแหลมการพลิกเครื่องหมายของ Z และการทดสอบเชิงลึกคืออะไร แต่การเปลี่ยนการ&lt;เปรียบเทียบกับการ&gt;เปรียบเทียบ ดังนั้นหากฉันเข้าใจอย่างถูกต้องและผู้แต่งไม่ได้โกหกหรือทำสิ่งต่าง ๆ ขึ้นมาการเปลี่ยนแปลง&lt;ที่&gt;เคยเป็นสิ่งสำคัญที่สุดสำหรับหลาย …
280 c  optimization  opengl  cpu  gpu 



11
หลักทิ้งแล้ว แต่ไฟล์หลักไม่ได้อยู่ในไดเรกทอรีปัจจุบัน?
ในขณะที่รันโปรแกรม C มันบอกว่า"(core dumped)"แต่ฉันไม่เห็นไฟล์ใด ๆ ภายใต้พา ธ ปัจจุบัน ฉันได้ตั้งค่าและตรวจสอบulimit: ulimit -c unlimited ulimit -a ฉันพยายามค้นหาไฟล์ชื่อ "core" แต่ไม่ได้รับไฟล์ทิ้งหลัก? ความช่วยเหลือใด ๆ ไฟล์หลักของฉันอยู่ที่ไหน
277 c  linux  coredump 

6
เมื่อใดที่ฉันควรใช้ mmap สำหรับการเข้าถึงไฟล์
สภาวะแวดล้อม POSIX จัดเตรียมการเข้าถึงไฟล์อย่างน้อยสองวิธี มีมาตรฐานสายระบบopen(), read(), write()และเพื่อน ๆ แต่ยังมีตัวเลือกของการใช้mmap()เพื่อแมไฟล์ลงในหน่วยความจำเสมือน เมื่อใดควรเลือกใช้อีกอันหนึ่ง อะไรคือข้อดีของแต่ละบุคคลที่รวมทั้งสองอินเทอร์เฟซ
276 c  file-io  posix  mmap 

13
malloc () และ free () ทำงานอย่างไร
ฉันต้องการทราบวิธีการmallocและการfreeทำงาน int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout &lt;&lt; p; free(p); // Obvious Crash, but I need how it works and why crash. cout &lt;&lt; p; return 0; } ฉันจะขอบคุณจริง ๆ ถ้าคำตอบอยู่ในระดับความลึกในระดับหน่วยความจำถ้าเป็นไปได้

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