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

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

1
วัตถุประสงค์ของคำหลักคงที่ในพารามิเตอร์อาร์เรย์ของฟังก์ชั่นเช่น "char s [static 10]" คืออะไร?
ขณะเรียกดูซอร์สโค้ดฉันพบฟังก์ชั่นเช่นนี้: void someFunction(char someArray[static 100]) { // do something cool here } ด้วยการทดลองบางอย่างดูเหมือนว่าผู้มีสิทธิ์อื่นอาจปรากฏที่นั่นด้วย: void someFunction(char someArray[const]) { // do something cool here } ดูเหมือนว่าตัวระบุจะได้รับอนุญาตเฉพาะภายใน[ ]เมื่ออาร์เรย์ถูกประกาศเป็นพารามิเตอร์ของฟังก์ชัน สิ่งเหล่านี้ทำอะไร ทำไมมันแตกต่างกันสำหรับพารามิเตอร์ฟังก์ชั่น?
144 c  arrays  parameters  static 

6
ข้อได้เปรียบของ __builtin_expect ของ GCC คืออะไรถ้ามีข้อความอื่น?
ฉันมาข้ามในที่ที่พวกเขาใช้#define__builtin_expect เอกสารกล่าวว่า: ฟังก์ชั่นในตัว: long __builtin_expect (long exp, long c) คุณอาจใช้__builtin_expectเพื่อให้ข้อมูลการทำนายสาขา โดยทั่วไปคุณควรใช้ความคิดเห็นโปรไฟล์จริงสำหรับสิ่งนี้ ( -fprofile-arcs) เนื่องจากโปรแกรมเมอร์ไม่ดีพอที่จะทำนายว่าโปรแกรมของพวกเขาทำงานได้จริงอย่างไร อย่างไรก็ตามมีแอพพลิเคชั่นที่รวบรวมข้อมูลนี้ยาก ค่าส่งคืนคือค่าของexpซึ่งควรเป็นนิพจน์ที่สำคัญ exp == cความหมายของในตัวที่ว่ามันเป็นที่คาดว่า ตัวอย่างเช่น: if (__builtin_expect (x, 0)) foo (); จะระบุว่าเราไม่ได้คาดหวังว่าจะโทรfooเพราะเราคาดว่าxจะเป็นศูนย์ ดังนั้นทำไมไม่ใช้โดยตรง: if (x) foo (); แทนไวยากรณ์ที่ซับซ้อนด้วย__builtin_expect?
144 c  linux  gcc  built-in 

11
วิธีรับข้อความแสดงข้อผิดพลาดจากรหัสข้อผิดพลาดที่ GetLastError () ส่งคืน
หลังจากการเรียกใช้ Windows API ฉันจะรับข้อความแสดงข้อผิดพลาดล่าสุดในรูปแบบข้อความได้อย่างไร GetLastError() ส่งคืนค่าจำนวนเต็มไม่ใช่ข้อความ
144 c++  c  winapi 

6
เราสามารถเขียนความคิดเห็นภายในชื่อตัวแปรได้หรือไม่?
int main() { i/*nt*/a = 10; return 0; } หากฉันมีรหัสด้านบนและต้องการนับโทเค็นจะเป็นโทเค็น 14 หรือ 13 หรือไม่? การเขียนความคิดเห็นภายในชื่อตัวแปรถูกต้องหรือไม่ คุณสามารถคิดว่าint i, int a, int iaมีการกำหนดทั่วโลก

9
ความแตกต่างระหว่าง sigaction และสัญญาณคืออะไร?
ฉันกำลังจะเพิ่มตัวจัดการสัญญาณพิเศษลงในแอพที่เรามีที่นี่และฉันสังเกตเห็นว่าผู้เขียนเคยsigaction()ตั้งค่าตัวจัดการสัญญาณอื่น ๆ signal()ฉันกำลังจะไปใช้ ในการติดตามการประชุมฉันควรใช้sigaction()แต่ถ้าฉันเขียนตั้งแต่ต้นฉันควรเลือกแบบไหนดี?
143 c  signals  posix 

2
ความสำคัญของแฟล็ก -pthread เมื่อรวบรวม
ในโปรเจ็กต์ C และ C ++ แบบมัลติเธรดที่หลากหลายฉันได้เห็นการ-pthreadตั้งค่าสถานะที่ใช้กับทั้งการคอมไพล์และการเชื่อมโยงสเตจในขณะที่คนอื่นไม่ได้ใช้เลยและผ่าน-lpthreadไปยังสเตจลิงก์ มีอันตรายใดบ้างที่ไม่ได้รวบรวมและเชื่อมโยงกับ-pthreadธง - นั่นคือสิ่งที่จะ-pthreadทำจริง ๆ ? ฉันสนใจแพลตฟอร์ม Linux เป็นหลัก
143 c++  c  linux  pthreads 

4
ความสัมพันธ์ระหว่าง BLAS, LAPACK และ ATLAS คืออะไร
ฉันไม่เข้าใจว่า BLAS, LAPACK และ ATLAS เกี่ยวข้องกันอย่างไรและฉันควรใช้มันอย่างไรด้วยกัน! ฉันดูคู่มือทั้งหมดของพวกเขาและฉันมีความคิดทั่วไปเกี่ยวกับ BLAS และ LAPACK และวิธีการใช้กับตัวอย่างที่ฉันพบ แต่ฉันไม่สามารถหาตัวอย่างที่แท้จริงได้โดยใช้ ATLAS เพื่อดูว่ามันเกี่ยวข้องกับอะไร สองคนนี้ ฉันพยายามทำงานเมทริกซ์ระดับต่ำและภาษาหลักของฉันคือ C ขั้นแรกฉันต้องการใช้ GSL แต่มันบอกว่าถ้าคุณต้องการประสิทธิภาพที่ดีที่สุดคุณควรใช้ BLAS และ ATLAS มีหน้าเว็บที่ดีให้ตัวอย่างที่ดีของวิธีการใช้ (ใน C) เหล่านี้ทั้งหมดด้วยกันไหม? ในคำอื่น ๆ ฉันกำลังมองหาการสอนเกี่ยวกับการใช้ทั้งสาม (หรือส่วนย่อยของพวกเขา!) ในระยะสั้นฉันสับสน!
143 c  lapack  blas  atlas 

16
ตัวชี้ไปยังตัวชี้ชี้แจง
ฉันกำลังทำตามบทช่วยสอนนี้เกี่ยวกับตัวชี้ไปยังตัวชี้ทำงานอย่างไร ให้ฉันอ้างอิงข้อความที่เกี่ยวข้อง: int i = 5, j = 6, k = 7; int *ip1 = &i, *ip2 = &j; ตอนนี้เราสามารถตั้งค่า int **ipp = &ip1; และippชี้ไปที่จุดที่จะต้องip1 คือและคือหรือ 5 เราสามารถอธิบายสถานการณ์ด้วยสัญกรณ์กล่องและลูกศรที่เราคุ้นเคยเช่นนี้i*ippip1**ippi ถ้าอย่างนั้นเราพูด *ipp = ip2; เราได้เปลี่ยนพอยน์เตอร์ที่ชี้โดยipp(นั่นคือip1) เพื่อให้มีสำเนาip2ดังนั้นip1ตอนนี้( ) จะชี้ไปที่j: คำถามของฉันคือ: ทำไมในภาพที่สองippยังคงชี้ไปip1แต่ไม่ip2?
142 c  pointers 

6
_DEBUG เทียบกับ NDEBUG
ควรใช้ตัวประมวลผลล่วงหน้าชุดใดเพื่อระบุส่วนการดีบักของรหัส ใช้#ifdef _DEBUGหรือ#ifndef NDEBUGหรือมีวิธีที่ดีกว่าที่จะทำเช่น#define MY_DEBUG? ฉันคิดว่า_DEBUGเป็น Visual Studio เฉพาะมาตรฐาน NDEBUG หรือไม่
142 c++  c  debugging 


6
มีฟังก์ชันการนอนหลับทางเลือกในหน่วย C ถึงมิลลิวินาทีหรือไม่?
ฉันมีซอร์สโค้ดที่คอมไพล์บน Windows ฉันกำลังแปลงให้ทำงานบน Red Hat Linux ซอร์สโค้ดได้รวม<windows.h>ไฟล์ส่วนหัวไว้และโปรแกรมเมอร์ได้ใช้Sleep()ฟังก์ชันเพื่อรอเป็นระยะเวลามิลลิวินาที สิ่งนี้ใช้ไม่ได้กับ Linux อย่างไรก็ตามฉันสามารถใช้sleep(seconds)ฟังก์ชันนี้ได้ แต่ใช้จำนวนเต็มเป็นวินาที ฉันไม่ต้องการแปลงมิลลิวินาทีเป็นวินาที มีฟังก์ชันการนอนหลับทางเลือกอื่นที่ฉันสามารถใช้กับการคอมไพล์ gcc บน Linux ได้หรือไม่
142 c  linux  sleep 

30
คุณสมบัติที่ซ่อนอยู่ของ C
ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ฉันรู้ว่ามีมาตรฐานอยู่เบื้องหลังการใช้งานคอมไพเลอร์ C ทั้งหมดดังนั้นจึงไม่มีคุณสมบัติที่ซ่อนอยู่ แม้จะเป็นเช่นนั้นฉันมั่นใจว่านักพัฒนา C ทุกคนมีกลอุบายที่ซ่อนอยู่ / ความลับที่พวกเขาใช้ตลอดเวลา
141 c  hidden-features 

21
แปลงเป้าหมาย -c typedef ให้เทียบเท่ากับสตริง
สมมติว่าฉันมี typedef ประกาศในไฟล์. h ของฉันเช่น: typedef enum { JSON, XML, Atom, RSS } FormatType; ฉันต้องการสร้างฟังก์ชั่นที่แปลงค่าตัวเลขของ typedef เป็นสตริง ตัวอย่างเช่นหากข้อความ[self toString:JSON]ถูกส่ง มันจะส่งคืน 'JSON' ฟังก์ชันจะมีลักษณะดังนี้: -(NSString *) toString:(FormatType)formatType { //need help here return []; } บังเอิญถ้าฉันลองไวยากรณ์นี้ [self toString:FormatType.JSON]; เพื่อส่งค่า typedef ไปยังเมธอดฉันได้รับข้อผิดพลาด ฉันพลาดอะไรไป
141 c  objective-c  enums  typedef 

16
จุดประสงค์ของการบล็อก 'if (0)' ในบล็อก if-else คืออะไร
คำถามของฉันเกี่ยวกับบรรทัดที่ฉันได้กล่าวถึงในเรื่องและฉันสามารถดูได้ในหลาย ๆ ที่ภายในรหัสการผลิต รหัสโดยรวมมีลักษณะดังนี้: if (0) { // Empty braces } else if (some_fn_call()) { // actual code } else if (some_other_fn_call()) { // another actual code ... } else { // default case } สาขาอื่นไม่เกี่ยวข้องกับคำถามของฉัน ฉันสงสัยว่าความหมายของการใส่if (0)ที่นี่คืออะไร เครื่องมือจัดฟันนั้นว่างเปล่าดังนั้นฉันไม่คิดว่ามันควรจะคอมเม้นต์บล็อคโค้ด มันบังคับให้คอมไพเลอร์ทำการปรับให้เหมาะสมหรือมีความตั้งใจแตกต่างกันหรือไม่? ฉันพยายามค้นหากรณีที่ชัดเจนนี้ที่นี่บน SO และบนอินเทอร์เน็ต แต่ไม่ประสบความสำเร็จ มีคำถามที่คล้ายกันเกี่ยวกับ JavaScript แต่ไม่ใช่ C. มีคำถามอื่นเกิดอะไรขึ้นเมื่อมีการกำหนดศูนย์ในเงื่อนไข `if` …
141 c  if-statement 

23
จะอธิบายพอยน์เตอร์ C (การประกาศเทียบกับโอเปอเรเตอร์ unary) ให้กับผู้เริ่มต้นได้อย่างไร
ฉันมีความยินดีที่จะอธิบายพอยน์เตอร์ให้กับการเขียนโปรแกรม C และเริ่มสะดุดเมื่อมีปัญหาต่อไปนี้ อาจไม่เหมือนปัญหาเลยถ้าคุณรู้วิธีใช้ตัวชี้ไปแล้ว แต่ลองดูตัวอย่างต่อไปนี้ด้วยใจที่ชัดเจน: int foo = 1; int *bar = &foo; printf("%p\n", (void *)&foo); printf("%i\n", *bar); สำหรับผู้เริ่มต้นการส่งออกอาจจะน่าแปลกใจ ในบรรทัดที่ 2 เขา / เธอเพิ่งประกาศ * bar ให้เป็น & foo แต่ในบรรทัดที่ 4 ปรากฎว่า * bar นั้นเป็น foo แทนที่จะเป็น & foo! ความสับสนคุณอาจพูดว่าเกิดจากความกำกวมของสัญลักษณ์ *: ในบรรทัดที่ 2 มันถูกใช้เพื่อประกาศพอยน์เตอร์ ในบรรทัดที่ 4 จะใช้เป็นตัวดำเนินการ unary ซึ่งดึงค่าจุดตัวชี้ที่ สองสิ่งที่แตกต่างใช่มั้ย …
141 c  pointers 

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