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

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

16
ฉันได้ยินมาว่า i ++ ไม่ปลอดภัยต่อเธรด ++ i เธรดปลอดภัยหรือไม่
ฉันได้ยินมาว่า i ++ ไม่ใช่คำสั่งที่ปลอดภัยต่อเธรดเนื่องจากในการประกอบมันจะลดลงไปที่การจัดเก็บค่าดั้งเดิมเป็นอุณหภูมิที่ใดที่หนึ่งเพิ่มขึ้นแล้วแทนที่ซึ่งอาจถูกขัดจังหวะโดยสวิตช์บริบท อย่างไรก็ตามฉันสงสัยเกี่ยวกับ ++ i เท่าที่ฉันสามารถบอกได้สิ่งนี้จะลดลงเป็นคำสั่งประกอบเดียวเช่น 'เพิ่ม r1, r1, 1' และเนื่องจากเป็นเพียงคำสั่งเดียวจึงไม่สามารถขัดจังหวะได้โดยสวิตช์บริบท ใครช่วยชี้แจงหน่อย ฉันสมมติว่ามีการใช้แพลตฟอร์ม x86
90 c++  c  multithreading 

5
จะทำให้ backtrace () / backtrace_symbols () พิมพ์ชื่อฟังก์ชันได้อย่างไร?
ลินุกซ์เฉพาะbacktrace()และbacktrace_symbols()อนุญาตให้คุณสร้างการติดตามการโทรของโปรแกรม อย่างไรก็ตามมันพิมพ์เฉพาะที่อยู่ของฟังก์ชันไม่ใช่ชื่อของโปรแกรมของฉัน ฉันจะทำให้พวกเขาพิมพ์ชื่อฟังก์ชันด้วยได้อย่างไร ฉันได้ลองรวบรวมโปรแกรมด้วย-gเช่นเดียวกับ-ggdb. กรณีทดสอบด้านล่างเพียงแค่พิมพ์สิ่งนี้: พื้นหลัง ------------ ./a.out () [0x8048616] ./a.out () [0x8048623] /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413] ./a.out () [0x8048421] ---------------------- ฉันต้องการให้ 2 รายการแรกแสดงชื่อฟังก์ชันด้วยfooและmain รหัส: #include <execinfo.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> static void full_write(int fd, const char *buf, size_t len) { while (len > 0) { ssize_t ret …
90 c  linux  debugging  backtrace 

4
ทำไม memmove เร็วกว่า memcpy?
ฉันกำลังตรวจสอบฮอตสปอตประสิทธิภาพในแอปพลิเคชันซึ่งใช้เวลา 50% ใน memmove (3) แอปพลิเคชันจะแทรกจำนวนเต็ม 4 ไบต์นับล้านลงในอาร์เรย์ที่จัดเรียงและใช้ memmove เพื่อเลื่อนข้อมูล "ไปทางขวา" เพื่อให้มีพื้นที่ว่างสำหรับค่าที่แทรก ความคาดหวังของฉันคือการคัดลอกหน่วยความจำนั้นเร็วมากและฉันรู้สึกประหลาดใจที่ใช้เวลากับ memmove นานมาก แต่แล้วฉันก็มีความคิดว่า memmove ทำงานช้าเพราะมันกำลังเคลื่อนย้ายพื้นที่ที่ทับซ้อนกันซึ่งจะต้องดำเนินการแบบวนซ้ำแทนการคัดลอกหน่วยความจำขนาดใหญ่ ฉันเขียน microbenchmark ขนาดเล็กเพื่อดูว่ามีความแตกต่างด้านประสิทธิภาพระหว่าง memcpy และ memmove หรือไม่โดยคาดหวังว่า memcpy จะชนะมือ ฉันใช้เกณฑ์มาตรฐานบนสองเครื่อง (core i5, core i7) และเห็นว่า memmove เร็วกว่า memcpy จริง ๆ บน core i7 ที่เก่ากว่าแม้จะเร็วกว่าเกือบสองเท่า! ตอนนี้ผมกำลังหาคำอธิบาย นี่คือเกณฑ์มาตรฐานของฉัน มันคัดลอก 100 mb ด้วย memcpy จากนั้นย้ายประมาณ …
90 c++  c  performance  memory 

12
C การจัดการหน่วยความจำ
ฉันได้ยินมาตลอดว่าในภาษา C คุณต้องดูวิธีจัดการหน่วยความจำจริงๆ และฉันยังคงเริ่มเรียนรู้ C แต่จนถึงตอนนี้ฉันไม่ต้องทำกิจกรรมที่เกี่ยวข้องกับหน่วยความจำเลย .. ฉันมักจะจินตนาการว่าต้องปล่อยตัวแปรและทำสิ่งที่น่าเกลียดทุกประเภท แต่ดูเหมือนจะไม่เป็นเช่นนั้น ใครช่วยแสดงตัวอย่างเวลาที่คุณจะต้องทำ "การจัดการหน่วยความจำ" บ้าง
90 c  memory 

4
การใช้ memset () return value คืออะไร?
memset()จะถูกประกาศให้ส่งคืนvoid*ซึ่งเป็นค่าเดียวกับที่อยู่ที่ส่งผ่านไปยังฟังก์ชันเสมอ การใช้คืนมูลค่าคืออะไร? ทำไมมันไม่กลับมาvoid?
90 c++  c  memset 

6
โปรแกรมแยกวิเคราะห์ GCC และ Clang เขียนด้วยลายมือจริงหรือ
ดูเหมือนว่า GCC และ LLVM-Clang กำลังใช้ตัวแยกวิเคราะห์การสืบเชื้อสายแบบเรียกซ้ำที่เขียนด้วยลายมือและไม่ได้สร้างด้วยเครื่องโดยใช้ Bison-Flex การแยกวิเคราะห์จากล่างขึ้นบน ขอคนที่นี่ช่วยยืนยันว่าเป็นกรณีนี้ได้ไหม และถ้าเป็นเช่นนั้นเหตุใดเฟรมเวิร์กคอมไพเลอร์หลักจึงใช้ตัวแยกวิเคราะห์ที่เขียนด้วยลายมือ อัปเดต : บล็อกที่น่าสนใจในหัวข้อนี้ที่นี่

3
กฎ“ as-if” คืออะไร?
ตามชื่อเรื่องว่า กฎ "as-if" คืออะไร? คำตอบทั่วไปที่เราจะได้รับคือ: กฎที่อนุญาตให้มีการแปลงรหัสใด ๆ และทั้งหมดที่ไม่เปลี่ยนแปลงพฤติกรรมที่สังเกตได้ของโปรแกรม ในบางครั้งเรามักจะได้รับพฤติกรรมจากการใช้งานบางอย่างซึ่งเป็นผลมาจากกฎนี้ ผิดหลายครั้ง. แล้วกฎนี้คืออะไรกันแน่ มาตรฐานไม่ได้กล่าวถึงกฎนี้อย่างชัดเจนว่าเป็นส่วนหรือย่อหน้าดังนั้นอะไรที่อยู่ภายใต้ขอบเขตของกฎนี้? สำหรับฉันแล้วดูเหมือนว่าเป็นพื้นที่สีเทาซึ่งไม่ได้กำหนดรายละเอียดโดยมาตรฐาน ใครสามารถอธิบายรายละเอียดที่อ้างถึงการอ้างอิงจากมาตรฐานได้อย่างละเอียด? หมายเหตุ: แท็กสิ่งนี้เป็น C และ C ++ ทั้งคู่เนื่องจากเกี่ยวข้องกับทั้งสองภาษา
90 c++  c  optimization  c++-faq  as-if 

7
การส่งตัวชี้ฟังก์ชันไปยังประเภทอื่น
สมมติว่าฉันมีฟังก์ชันที่ยอมรับvoid (*)(void*)ตัวชี้ฟังก์ชันเพื่อใช้เป็นการโทรกลับ: void do_stuff(void (*callback_fp)(void*), void* callback_arg); ตอนนี้ถ้าฉันมีฟังก์ชันเช่นนี้: void my_callback_function(struct my_struct* arg); ฉันสามารถทำได้อย่างปลอดภัยหรือไม่? do_stuff((void (*)(void*)) &my_callback_function, NULL); ฉันได้ดูคำถามนี้แล้วและฉันได้ดูมาตรฐาน C บางอย่างซึ่งบอกว่าคุณสามารถส่งเป็น 'ตัวชี้ฟังก์ชันที่เข้ากันได้' แต่ฉันไม่พบคำจำกัดความว่า 'ตัวชี้ฟังก์ชันที่เข้ากันได้' หมายถึงอะไร

14
สแต็กเติบโตขึ้นหรือลง?
ฉันมีรหัสชิ้นนี้ใน c: int q = 10; int s = 5; int a[3]; printf("Address of a: %d\n", (int)a); printf("Address of a[1]: %d\n", (int)&a[1]); printf("Address of a[2]: %d\n", (int)&a[2]); printf("Address of q: %d\n", (int)&q); printf("Address of s: %d\n", (int)&s); ผลลัพธ์คือ: Address of a: 2293584 Address of a[1]: 2293588 Address of a[2]: 2293592 …
90 c  memory  stack 

10
ความแตกต่างระหว่าง const และ const ผันผวน
หากเราประกาศตัวแปรvolatileทุกครั้งที่มีการอัปเดตค่าใหม่ หากเราประกาศตัวแปรเป็นconstค่าของตัวแปรนั้นจะไม่มีการเปลี่ยนแปลง แล้วconst volatile int temp; อะไรคือการใช้ประกาศตัวแปรtempตามข้างบน? จะเกิดอะไรขึ้นถ้าเราประกาศเป็นconst int temp?
90 c  embedded 

10
CMake ไม่สามารถระบุภาษาตัวเชื่อมโยงด้วย C ++
ฉันพยายามเรียกใช้โปรแกรม cmake hello world บน Windows 7 x64 กับทั้ง Visual Studio 2010 และ Cygwin แต่ดูเหมือนจะไม่สามารถใช้งานได้ โครงสร้างไดเร็กทอรีของฉันมีดังนี้: HelloWorld -- CMakeLists.txt -- src/ -- -- CMakeLists.txt -- -- main.cpp -- build/ ฉันทำcd buildตามด้วย a cmake ..และได้รับข้อผิดพลาดที่ระบุว่า CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language …
90 c++  c  cmake 

3
จะหามาตรฐาน C89 / C90 ในรูปแบบ PDF ได้ที่ไหน?
ฉันกำลังมองหามาตรฐาน C89 / C90เวอร์ชันฟรีแต่หาไม่เจอเลย! ทำไมหายากจัง มาตรฐาน C99 และ C11 นั้นง่ายมากในการรับสำเนาบนอินเทอร์เน็ต แม้แต่ในคำถาม Stack Overflow ฉันจะค้นหาเอกสารมาตรฐาน C หรือ C ++ ปัจจุบันได้ที่ไหน และมาตรฐาน C การได้รับมาตรฐานไม่มีสิ่งที่ฉันกำลังมองหา ค้นหาเว็บไม่ได้ช่วยอย่างใดอย่างหนึ่งหรือไม่มาตรฐานเปิด
90 c  ansi  c89 

4
Import Library ทำงานอย่างไร รายละเอียด?
ฉันรู้ว่าสิ่งนี้อาจดูค่อนข้างธรรมดาสำหรับคนที่ชอบฟัง แต่ฉันต้องการทำให้มันใส เมื่อฉันต้องการใช้ Win32 DLL โดยปกติฉันจะเรียก API เช่น LoadLibrary () และ GetProcAdderss () แต่เมื่อเร็ว ๆ นี้ฉันกำลังพัฒนาด้วย DirectX9 และฉันต้องการเพิ่มไฟล์ d3d9.lib , d3dx9.libและอื่น ๆ ฉันได้ยินมามากพอแล้วว่า LIB ใช้สำหรับการลิงก์แบบคงที่และ DLL สำหรับการลิงก์แบบไดนามิก ดังนั้นความเข้าใจในปัจจุบันของฉันคือ LIB มีการใช้งานวิธีการและเชื่อมโยงแบบคงที่ในเวลาลิงก์เป็นส่วนหนึ่งของไฟล์ EXE สุดท้าย แม้ว่า DLL จะโหลดแบบไดนามิกที่รันไทม์และไม่ได้เป็นส่วนหนึ่งของไฟล์ EXE สุดท้าย แต่บางครั้งมีไฟล์ LIB บางไฟล์ที่มาพร้อมกับไฟล์ DLL ดังนั้น: ไฟล์ LIB เหล่านี้มีไว้ทำอะไร? พวกเขาบรรลุสิ่งที่ตั้งใจไว้ได้อย่างไร? มีเครื่องมือใดบ้างที่สามารถให้ฉันตรวจสอบภายในของไฟล์ LIB เหล่านี้ได้ อัปเดต …
90 c++  c  windows  visual-c++ 

6
คอมไพเลอร์สร้างโค้ดที่ดีกว่าสำหรับ do-while loops เมื่อเทียบกับลูปประเภทอื่น ๆ หรือไม่?
มีความคิดเห็นในไลบรารีการบีบอัด zlib (ซึ่งใช้ในโปรเจ็กต์ Chromium และอื่น ๆ อีกมากมาย) ซึ่งหมายความว่า do-while loop ใน C สร้างโค้ด "ดีกว่า" ในคอมไพเลอร์ส่วนใหญ่ นี่คือข้อมูลโค้ดที่ปรากฏ do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers …

9
ทำไม +++++ b ไม่ทำงาน
int main () { int a = 5,b = 2; printf("%d",a+++++b); return 0; } รหัสนี้ให้ข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด: ต้องการ lvalue เป็นตัวถูกดำเนินการส่วนเพิ่ม แต่ถ้าผมใส่ช่องว่างตลอดa++ +และ++bแล้วมันก็ทำงานได้ดี int main () { int a = 5,b = 2; printf("%d",a++ + ++b); return 0; } ข้อผิดพลาดหมายถึงอะไรในตัวอย่างแรก
89 c  lvalue 

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