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

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

7
เคอร์เนลลินุกซ์สามารถคอมไพล์ตัวเองได้อย่างไร?
ฉันไม่ค่อยเข้าใจกระบวนการคอมไพล์ของเคอร์เนล Linux เมื่อฉันติดตั้งระบบ Linux บนเครื่องของฉัน นี่คือบางสิ่งที่ทำให้ฉันสับสน: เคอร์เนลถูกเขียนด้วย C อย่างไรก็ตามเคอร์เนลถูกคอมไพล์โดยไม่ติดตั้งคอมไพเลอร์ได้อย่างไร? หากคอมไพเลอร์ C ถูกติดตั้งบนเครื่องของฉันก่อนที่จะคอมไพล์เคอร์เนลคอมไพเลอร์จะรวบรวมเองได้อย่างไรโดยไม่ต้องติดตั้งคอมไพเลอร์ ฉันสับสนมากสองสามวันขอบคุณสำหรับการตอบกลับ

4
คำจำกัดความของคำว่า "ระเหย" นี้มีความผันผวนหรือ GCC มีปัญหาการปฏิบัติตามมาตรฐานหรือไม่
ฉันต้องการฟังก์ชันที่ (เช่น SecureZeroMemory จาก WinAPI) หน่วยความจำเป็นศูนย์เสมอและไม่ได้รับการปรับให้เหมาะสมแม้ว่าคอมไพเลอร์จะคิดว่าหน่วยความจำนั้นจะไม่ถูกเข้าถึงอีกเลยหลังจากนั้น ดูเหมือนผู้สมัครที่สมบูรณ์แบบสำหรับความผันผวน แต่ฉันมีปัญหาบางอย่างในการทำให้ GCC ทำงานได้จริง นี่คือฟังก์ชั่นตัวอย่าง: void volatileZeroMemory(volatile void* ptr, unsigned long long size) { volatile unsigned char* bytePtr = (volatile unsigned char*)ptr; while (size--) { *bytePtr++ = 0; } } ง่ายพอ แต่รหัสที่ GCC สร้างขึ้นจริงถ้าคุณเรียกว่ามันแตกต่างกันอย่างมากกับเวอร์ชันคอมไพเลอร์และจำนวนไบต์ที่คุณพยายามเป็นศูนย์ https://godbolt.org/g/cMaQm2 GCC 4.4.7 และ 4.5.3 ไม่เคยเพิกเฉยต่อความผันผวน GCC 4.6.4 และ 4.7.3 …
89 c++  c  gcc  standards 

3
Threadsafe เทียบกับ re-entrant
เมื่อเร็ว ๆ นี้ฉันถามคำถามโดยมีหัวข้อว่า"เธรด Malloc ปลอดภัยหรือไม่" และในนั้นฉันถามว่า "malloc re-entrant หรือไม่" ฉันรู้สึกว่าผู้เข้าใหม่ทั้งหมดปลอดภัยต่อเธรด สมมติฐานนี้ผิดหรือไม่?

18
คุณจะแปลงอาร์เรย์ไบต์เป็นสตริงเลขฐานสิบหกใน C ได้อย่างไร?
ฉันมี: uint8 buf[] = {0, 1, 10, 11}; ฉันต้องการแปลงอาร์เรย์ไบต์เป็นสตริงเพื่อที่ฉันจะสามารถพิมพ์สตริงโดยใช้ printf: printf("%s\n", str); และรับ (ไม่จำเป็นต้องใช้เครื่องหมายทวิภาค): "00:01:0A:0B" ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.
89 c  string  hex 

2
vdso และ vsyscall คืออะไร?
ฉันทำ sudo cat /proc/1/maps -vv ฉันพยายามทำความเข้าใจกับผลลัพธ์ฉันเห็นไลบรารีที่แชร์จำนวนมากถูกแมปกับเซ็กเมนต์การแมปหน่วยความจำตามที่คาดไว้ 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

12
พิมพ์ข้อความแทนค่าจาก C enum
int main() { enum Days{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}; Days TheDay; int j = 0; printf("Please enter the day of the week (0 to 6)\n"); scanf("%d",&j); TheDay = Days(j); //how to PRINT THE VALUES stored in TheDay printf("%s",TheDay); // isnt working return 0; }
89 c  enums 


19
วิธีง่ายๆในการใช้ตัวแปรประเภท enum เป็นสตริงใน C?
นี่คือสิ่งที่ฉันพยายามทำ: typedef enum { ONE, TWO, THREE } Numbers; ฉันกำลังพยายามเขียนฟังก์ชันที่จะทำกรณีสวิตช์คล้ายกับต่อไปนี้: char num_str[10]; int process_numbers_str(Numbers num) { switch(num) { case ONE: case TWO: case THREE: { strcpy(num_str, num); //some way to get the symbolic constant name in here? } break; default: return 0; //no match return 1; } แทนที่จะกำหนดทุกกรณีมีวิธีตั้งค่าโดยใช้ตัวแปร enum เหมือนที่ฉันพยายามทำข้างต้นหรือไม่?

8
ฉันจะคืนค่าหลายค่าจากฟังก์ชันใน C ได้อย่างไร
ถ้าฉันมีฟังก์ชันที่สร้างผลลัพธ์intและผลลัพธ์stringฉันจะคืนค่าทั้งสองจากฟังก์ชันได้อย่างไร เท่าที่ฉันสามารถบอกได้ว่าฉันสามารถคืนค่าได้เพียงสิ่งเดียวเท่านั้นตามที่กำหนดโดยประเภทที่อยู่ข้างหน้าชื่อฟังก์ชัน
89 c  return-value 

3
จะใช้ glOrtho () ใน OpenGL ได้อย่างไร?
ฉันไม่เข้าใจการใช้งานของglOrtho. ใครช่วยอธิบายว่ามันใช้ทำอะไร? ใช้กำหนดช่วงพิกัด xy และ z หรือไม่? glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); หมายความว่าช่วง x, y และ z อยู่ระหว่าง -1 ถึง 1?
89 c++  c  opengl 


8
วิธีที่มีประสิทธิภาพในการค้นหาองค์ประกอบ
เมื่อเร็ว ๆ นี้ฉันได้ให้สัมภาษณ์ซึ่งพวกเขาถามคำถาม " ค้นหา " คำถามคือ: ถือว่ามีอาร์เรย์ของ (บวก) จำนวนเต็มซึ่งแต่ละองค์ประกอบเป็นอย่างใดอย่างหนึ่ง+1หรือ-1เมื่อเทียบกับองค์ประกอบที่อยู่ใกล้เคียง ตัวอย่าง: array = [4,5,6,5,4,3,2,3,4,5,6,7,8]; ตอนนี้ค้นหา7และส่งคืนตำแหน่ง ฉันให้คำตอบนี้: จัดเก็บค่าในอาร์เรย์ชั่วคราวเรียงลำดับแล้วใช้การค้นหาแบบไบนารี หากพบองค์ประกอบให้คืนตำแหน่งในอาร์เรย์ชั่วคราว (หากตัวเลขเกิดขึ้นสองครั้งให้คืนค่าที่เกิดขึ้นครั้งแรก) แต่ดูเหมือนพวกเขาจะไม่พอใจกับคำตอบนี้ คำตอบที่ถูกต้องคืออะไร?

13
แอปพลิเคชันของตัวดำเนินการประมวลผล ## preprocessor และ gotchas ที่ต้องพิจารณามีอะไรบ้าง?
ดังที่ได้กล่าวไว้ในคำถามก่อนหน้านี้หลายข้อฉันกำลังทำงานผ่าน K&R และกำลังอยู่ในพรีโปรเซสเซอร์ สิ่งที่น่าสนใจอีกอย่างหนึ่ง - สิ่งที่ฉันไม่เคยรู้มาก่อนจากการพยายามเรียนรู้ C - ก่อนหน้านี้คือ##ตัวดำเนินการก่อนโปรเซสเซอร์ ตาม K&R: ตัวดำเนินการตัวประมวลผลก่อน## จัดเตรียมวิธีการต่ออาร์กิวเมนต์ที่แท้จริงระหว่างการขยายมาโคร หากพารามิเตอร์ในข้อความแทนที่อยู่ติดกับ a ##พารามิเตอร์จะถูกแทนที่ด้วยอาร์กิวเมนต์จริง ##และช่องว่างรอบ ๆ จะถูกลบออกและผลลัพธ์จะถูกสแกนใหม่ ตัวอย่างเช่นแมโครpaste เชื่อมสองอาร์กิวเมนต์: #define paste(front, back) front ## back เพื่อสร้างโทเค็นpaste(name, 1) name1 ทำไมคนถึงใช้สิ่งนี้ในโลกแห่งความเป็นจริง ตัวอย่างการใช้งานจริงมีอะไรบ้างและมีข้อควรพิจารณาหรือไม่?

2
gcc / g ++:“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”
g++ ทำให้ฉันมีข้อผิดพลาดของแบบฟอร์ม: foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory compilation terminated. จะเหมือนกันเมื่อคอมไพล์โปรแกรม C ด้วยgcc. ทำไมถึงเป็นเช่นนั้น? โปรดทราบ:คำถามนี้ถูกถามหลายครั้งก่อนหน้านี้ แต่ทุกครั้งจะเฉพาะเจาะจงสำหรับสถานการณ์ของผู้ถาม จุดประสงค์ของคำถามนี้คือการมีคำถามที่ผู้อื่นสามารถปิดเป็นรายการที่ซ้ำกันได้ทุกครั้ง คำถามที่พบบ่อย
88 c++  c  gcc  g++  c++-faq 

5
ใน C คำสั่ง printf แบบยาวสามารถแบ่งออกเป็นหลายบรรทัดได้หรือไม่?
ฉันมีข้อความต่อไปนี้: printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); ฉันต้องการที่จะทำลายมัน ฉันลองทำตามขั้นตอนต่อไปนี้ แต่ไม่ได้ผล printf("name: %s\t args: %s\t value %d\t arraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize); ฉันจะทำลายมันได้อย่างไร?
88 c  printf 

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