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

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


4
ทำไมทุกคนถึงพิมพ์ดีฟมากกว่าประเภท C มาตรฐาน?
หากคุณต้องการที่จะใช้Qtคุณต้องโอบกอดquint8, quint16และอื่น ๆ หากคุณต้องการที่จะใช้GLibคุณต้องยินดีต้อนรับguint8, guint16และอื่น ๆ บนลินุกซ์มีu32, s16และอื่น ๆ UC / OSกำหนดSINT32, UINT16และอื่น ๆ และถ้าคุณต้องใช้สิ่งเหล่านั้นผสมกันคุณควรเตรียมพร้อมสำหรับปัญหา เพราะในเครื่องของคุณu32จะได้รับtypedefวันที่มากกว่าlongและquint32จะได้รับtypedefวันที่มากกว่าintและคอมไพเลอร์จะบ่น ทำไมทุกคนถึงทำเช่นนี้ถ้ามี<stdint.h>? นี่เป็นประเพณีสำหรับห้องสมุดหรือไม่?
103 c++  c  stdint 

12
เหตุใดตัวอักษรตัวอักษร C จึงอยู่ภายในแทนอักขระ
ใน C sizeof('a') == sizeof(char) == 1++, สิ่งนี้ทำให้เข้าใจง่ายเนื่องจาก'a'เป็นอักขระตามตัวอักษรและsizeof(char) == 1ตามที่กำหนดโดยมาตรฐาน ใน C อย่างไรก็ตามsizeof('a') == sizeof(int). นั่นคือดูเหมือนว่าอักษรตัวอักษร C เป็นจำนวนเต็ม มีใครรู้บ้างว่าทำไม? ฉันสามารถค้นหาการกล่าวถึง C quirk นี้ได้มากมาย แต่ไม่มีคำอธิบายว่าเหตุใดจึงมีอยู่
103 c++  c  char  sizeof 

7
ทำให้โปรแกรมทำงานช้า
มีวิธีใดบ้างในการรันโปรแกรม C ++ ให้ช้าลงโดยการเปลี่ยนพารามิเตอร์ OS ใน Linux? ด้วยวิธีนี้ฉันต้องการจำลองสิ่งที่จะเกิดขึ้นหากโปรแกรมนั้นเกิดขึ้นเพื่อทำงานบนเครื่องที่ช้าลงจริง กล่าวอีกนัยหนึ่งเครื่องที่เร็วกว่าควรทำงานเป็นเครื่องที่ช้าลงสำหรับโปรแกรมนั้น ๆ
103 c++  c  linux  unix  ubuntu 

4
ความหมายของคำศัพท์ที่เกี่ยวข้องกับความจำคืออะไร?
ฉันกำลังอ่านหนังสือเกี่ยวกับหน่วยความจำเป็นแนวคิดในการเขียนโปรแกรม ในหนึ่งในบทต่อมาผู้เขียนใช้คำว่าเวทีอย่างหนักแต่ไม่เคยให้คำจำกัดความ ฉันได้ค้นหาความหมายของคำและความเกี่ยวข้องกับความทรงจำ แต่ก็ไม่พบอะไรเลย ต่อไปนี้เป็นบริบทบางส่วนที่ผู้เขียนใช้คำนี้: "ตัวอย่างถัดไปของการทำให้เป็นอนุกรมประกอบด้วยกลยุทธ์ที่เรียกว่าการจัดสรรหน่วยความจำจากเวทีเฉพาะ" "... สิ่งนี้มีประโยชน์เมื่อจัดการกับการรั่วไหลของหน่วยความจำหรือเมื่อจัดสรรจากอารีน่าเฉพาะ" "... ถ้าเราต้องการ deallocate หน่วยความจำแล้วเราจะ deallocate ทั้งเวที ." ผู้เขียนใช้คำว่า 100 กว่าครั้งในหนึ่งบท คำจำกัดความเดียวในอภิธานศัพท์คือ: การจัดสรรจากอารีน่า - เทคนิคการจัดสรรอารีน่าก่อนจากนั้นจัดการการจัดสรร / การจัดสรรภายในเวทีโดยโปรแกรมเอง (แทนที่จะเป็นโดยผู้จัดการหน่วยความจำกระบวนการ) ใช้สำหรับการบดอัดและการทำให้เป็นอนุกรมของโครงสร้างข้อมูลและวัตถุที่ซับซ้อนหรือสำหรับการจัดการหน่วยความจำในระบบที่มีความสำคัญด้านความปลอดภัยและ / หรือทนต่อความผิดพลาด ใครสามารถกำหนดเวทีให้ฉันด้วยบริบทเหล่านี้?

4
ระดับการเพิ่มประสิทธิภาพ GCC มีกี่ระดับ?
ระดับการเพิ่มประสิทธิภาพGCCมีกี่ระดับ? ฉันลอง gcc -O1, gcc -O2, gcc -O3 และ gcc -O4 ถ้าฉันใช้จำนวนมากมันจะไม่ได้ผล อย่างไรก็ตามฉันได้พยายามแล้ว gcc -O100 และรวบรวม ระดับการเพิ่มประสิทธิภาพมีกี่ระดับ?

4
ใช้ไลบรารี C ++ ในรหัส C
ฉันมีไลบรารี C ++ ที่มีคลาสต่างๆสำหรับจัดการข้อมูล ฉันมีซอร์สโค้ดสำหรับไลบรารี ฉันต้องการขยาย C ++ API เพื่อรองรับการเรียกฟังก์ชัน C เพื่อให้สามารถใช้ไลบรารีกับรหัส C และรหัส C ++ ได้ในเวลาเดียวกัน ฉันใช้โซ่เครื่องมือ GNU (gcc, glibc ฯลฯ ) ดังนั้นการรองรับภาษาและสถาปัตยกรรมจึงไม่ใช่ปัญหา มีสาเหตุใดบ้างที่ทำให้ไม่สามารถทำได้ในทางเทคนิค ? มีgotchaอะไรบ้างที่ฉันต้องระวัง? มีแหล่งข้อมูลโค้ดตัวอย่างและ / หรือเอกสารเกี่ยวกับเรื่องนี้หรือไม่ สิ่งอื่น ๆ ที่ฉันได้ค้นพบ: ใช้สิ่งต่อไปนี้เพื่อตัดส่วนหัว C ++ ของคุณที่จำเป็นต้องใช้โดยรหัส C #ifdef __cplusplus extern "C" { #endif // // Code goes here ... …
103 c++  c  gcc  glibc 

12
การแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งใน C?
ฉันกำลังพยายามเขียนโปรแกรมที่สามารถเปรียบเทียบไฟล์สองไฟล์ทีละบรรทัดทีละคำหรืออักขระทีละตัวใน C จะต้องสามารถอ่านได้ในตัวเลือกบรรทัดคำสั่ง-l -w -i or --... ถ้าตัวเลือกคือ -l จะเปรียบเทียบไฟล์ทีละบรรทัด ถ้าตัวเลือกคือ -w จะเปรียบเทียบไฟล์ทีละคำ ถ้าตัวเลือกคือ - จะถือว่าอาร์กิวเมนต์ถัดไปเป็นชื่อไฟล์แรกโดยอัตโนมัติ ถ้าตัวเลือกคือ -i จะเปรียบเทียบในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ค่าเริ่มต้นในการเปรียบเทียบไฟล์ทีละอักขระ ไม่ควรคำนึงว่าจะป้อนตัวเลือกกี่ครั้งตราบใดที่ -w และ -l ไม่ได้ป้อนพร้อมกันและมีไฟล์ไม่เกิน 2 ไฟล์ ฉันไม่รู้ด้วยซ้ำว่าจะเริ่มต้นด้วยการแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่ง กรุณาช่วย :( นี่คือรหัสที่ผมคิดขึ้นมาสำหรับทุกอย่าง ฉันยังไม่ได้ตรวจสอบข้อผิดพลาดเลย แต่ฉันสงสัยว่าฉันเขียนสิ่งที่ซับซ้อนเกินไปหรือไม่? /* * Functions to compare files. */ int compare_line(); int compare_word(); int compare_char(); int case_insens(); /* * …

6
คำจำกัดความของโครงสร้างควรอยู่ในไฟล์. h หรือ. c?
ฉันเห็นทั้งคำจำกัดความแบบเต็มของstructs ในส่วนหัวและเพียงแค่การประกาศ - วิธีหนึ่งมีข้อดีกว่าวิธีอื่นหรือไม่ ถ้ามันสร้างความแตกต่างฉันมักจะพิมพ์โครงสร้างแบบนี้ในไฟล์ .h typedef struct s s_t; แก้ไข เพื่อความชัดเจนอ็อพชันคือการประกาศในไฟล์ส่วนหัวและนิยามในคลาสหรือทั้งการประกาศและนิยามในไฟล์ส่วนหัว ทั้งสองอย่างควรส่งผลให้สามารถใช้งานได้เหมือนกันแม้ว่าจะมีการเชื่อมโยงกันก็ตาม ฉันเห็นรายการเกือบซ้ำกันหลายรายการเช่นที่นี่แต่ไม่มีรายการที่ตรงกันทั้งหมด โปรดแก้ไขฉันหากฉันผิดในเรื่องนี้
102 c  header  struct 

6
snprintf และ Visual Studio 2010
ฉันโชคไม่ดีพอที่จะติดอยู่กับ VS 2010 สำหรับโปรเจ็กต์และสังเกตว่าโค้ดต่อไปนี้ยังไม่ได้สร้างโดยใช้คอมไพเลอร์ที่ไม่เป็นไปตามมาตรฐาน: #include <stdio.h> #include <stdlib.h> int main (void) { char buffer[512]; snprintf(buffer, sizeof(buffer), "SomeString"); return 0; } (คอมไพล์ล้มเหลวด้วยข้อผิดพลาด: C3861: 'snprintf': ไม่พบตัวระบุ) ฉันจำได้ว่านี่เป็นกรณีย้อนกลับไปใน VS 2005 และรู้สึกตกใจที่เห็นว่ามันยังไม่ได้รับการแก้ไข ไม่มีใครรู้ว่า Microsoft มีแผนจะย้ายไลบรารี C มาตรฐานไปสู่ปี 2010 หรือไม่?

11
เหตุใด printf ที่มีอาร์กิวเมนต์เดียว (ไม่มีตัวระบุการแปลง) จึงเลิกใช้งาน
ในหนังสือที่ฉันกำลังอ่านมีเขียนว่าprintfด้วยอาร์กิวเมนต์เดียว (โดยไม่มีตัวระบุการแปลง) จะเลิกใช้งานแล้ว ขอแนะนำให้เปลี่ยน printf("Hello World!"); ด้วย puts("Hello World!"); หรือ printf("%s", "Hello World!"); ใครช่วยบอกทีว่าทำไมถึงprintf("Hello World!");ผิด? มีเขียนไว้ในหนังสือว่ามีช่องโหว่ ช่องโหว่เหล่านี้คืออะไร?

7
ความสับสนเกี่ยวกับการเริ่มต้นอาร์เรย์ใน C
ในภาษา C หากเริ่มต้นอาร์เรย์เช่นนี้: int a[5] = {1,2}; จากนั้นองค์ประกอบทั้งหมดของอาร์เรย์ที่ไม่ได้เตรียมใช้งานอย่างชัดเจนจะถูกกำหนดค่าเริ่มต้นโดยปริยายด้วยศูนย์ แต่ถ้าฉันเริ่มต้นอาร์เรย์เช่นนี้: int a[5]={a[2]=1}; printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]); เอาต์พุต: 1 0 1 0 0 ฉันไม่เข้าใจทำไมa[0]พิมพ์1แทนที่จะเป็น0? เป็นพฤติกรรมที่ไม่ได้กำหนดหรือไม่? หมายเหตุ:คำถามนี้ถูกถามในการสัมภาษณ์

20
C / C ++ ตรวจสอบว่ามีการตั้งค่าหนึ่งบิตหรือไม่เช่นตัวแปร int
int temp = 0x5E; // in binary 0b1011110. มีวิธีตรวจสอบว่าบิต 3 ใน temp เป็น 1 หรือ 0 โดยไม่ต้องขยับและกำบังเล็กน้อยหรือไม่ แค่อยากรู้ว่ามีฟังก์ชันในตัวสำหรับสิ่งนี้หรือฉันถูกบังคับให้เขียนด้วยตัวเอง
102 c++  c  bit-manipulation 

2
&& หมายถึงอะไรในโมฆะ * p = && abc;
void *p = &&abc;ฉันมาข้ามชิ้นส่วนของรหัส ความสำคัญของ&&ที่นี่คืออะไร? ฉันรู้เกี่ยวกับการอ้างอิง rvalue แต่ฉันคิดว่า&&ใช้ในบริบทนี้แตกต่างกัน อะไร&&บ่งชี้ในvoid *p = &&abc;?
102 c++  c  gcc  operators 

10
“ f” หลังตัวเลข
อะไรfหลังจากตัวเลขที่บ่งบอก? นี่มาจาก C หรือ Objective-C? มีความแตกต่างในการไม่เพิ่มสิ่งนี้เป็นจำนวนคงที่หรือไม่? CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); คุณอธิบายได้ไหมว่าทำไมฉันถึงไม่เขียน: CGRect frame = CGRectMake(0, 0, 320, 50);

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