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

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

30
ทำไมโปรแกรมไม่ได้เขียนในแอสเซมบลีบ่อยขึ้น [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ดูเหมือนว่าเป็นความคิดเห็นหลักว่าการเขียนโปรแกรมแอสเซมบลีใช้เวลานานกว่าและยากที่จะโปรแกรมในภาษาระดับสูงกว่าเช่น C. ดังนั้นจึงดูเหมือนว่าจะแนะนำหรือสันนิษฐานว่าดีกว่าที่จะเขียนด้วยภาษาระดับสูงด้วยเหตุผลเหล่านี้ และสำหรับเหตุผลของการพกพาที่ดีขึ้น เมื่อเร็ว ๆ นี้ฉันได้เขียนในชุดประกอบ x86 และเริ่มต้นกับฉันแล้วว่าเหตุผลเหล่านี้อาจไม่จริงยกเว้นการพกพา บางทีมันอาจเป็นเรื่องของความคุ้นเคยและการรู้วิธีเขียนชุดประกอบ ฉันยังสังเกตเห็นว่าการเขียนโปรแกรมในแอสเซมบลีค่อนข้างแตกต่างจากการเขียนโปรแกรมใน HLL บางทีโปรแกรมเมอร์แอสเซมบลีที่ดีและมีประสบการณ์สามารถเขียนโปรแกรมได้อย่างง่ายดายและรวดเร็วเหมือนกับโปรแกรมเมอร์ C ที่มีประสบการณ์เขียนใน C อาจเป็นเพราะการเขียนโปรแกรมแอสเซมบลีค่อนข้างแตกต่างจาก HLLs ดังนั้นต้องใช้ความคิดวิธีการและวิธีการที่แตกต่างกันซึ่งทำให้ดูเหมือนว่าโปรแกรมในสิ่งที่ไม่คุ้นเคยเป็นเรื่องที่น่าอึดอัดใจมาก ถ้าการพกพาไม่ใช่ปัญหาจริงๆแล้ว C จะมีอะไรบ้างในแอสเซมเบลอร์ที่ดีเช่น NASM แก้ไข: เพียงเพื่อชี้ให้เห็น เมื่อคุณกำลังเขียนในการชุมนุมคุณไม่จำเป็นต้องเขียนในรหัสการเรียนการสอน คุณสามารถใช้มาโครและโพรซีเดอร์และการประชุมของคุณเองเพื่อสร้าง abstractions ต่าง ๆ เพื่อทำให้โปรแกรมแยกส่วนเพิ่มเติมบำรุงรักษาได้ง่ายขึ้นและอ่านง่ายขึ้น นี่คือที่คุ้นเคยกับวิธีการเขียนแอสเซมบลีที่ดีมา

3
เหตุใดคำจำกัดความของฟังก์ชันพอยน์เตอร์จึงทำงานกับเครื่องหมาย '&' หรือเครื่องหมายดอกจัน '*' จำนวนเท่าใดก็ได้
ทำไมงานต่อไปนี้ void foo() { cout << "Foo to you too!\n"; }; int main() { void (*p1_foo)() = foo; void (*p2_foo)() = *foo; void (*p3_foo)() = &foo; void (*p4_foo)() = *&foo; void (*p5_foo)() = &*foo; void (*p6_foo)() = **foo; void (*p7_foo)() = **********************foo; (*p1_foo)(); (*p2_foo)(); (*p3_foo)(); (*p4_foo)(); (*p5_foo)(); (*p6_foo)(); (*p7_foo)(); }
216 c++  c  function-pointers 



3
วงเล็บรอบชื่อฟังก์ชันหมายถึงอะไร
ในไฟล์ต้นฉบับโครงการหนึ่งฉันพบนิยามฟังก์ชัน C นี้: int (foo) (int *bar) { return foo (bar); } หมายเหตุ: ไม่มีเครื่องหมายดอกจันติดกับfooดังนั้นจึงไม่ใช่ตัวชี้ฟังก์ชัน หรือมันคืออะไร? เกิดอะไรขึ้นกับการโทรซ้ำ?
214 c  function  parentheses 

4
ความแตกต่างระหว่าง. so และ. dylib บน osx คืออะไร?
.dylib เป็นส่วนขยายไลบรารีแบบไดนามิกบน OSX แต่ไม่เคยชัดเจนสำหรับฉันเมื่อฉันไม่สามารถ / ไม่ควรใช้วัตถุที่ใช้ร่วมกัน unix .so แบบดั้งเดิม บางคำถามที่ฉันมี: ในระดับแนวคิดอะไรคือความแตกต่างที่สำคัญระหว่าง. so และ. dylib? เมื่อใดที่ / ฉันควรใช้อันอื่น? เทคนิคการรวบรวม & เคล็ดลับ (ตัวอย่างเช่นการแทนที่สำหรับ gcc -shared -fPIC เนื่องจากไม่ได้ทำงานบน osx)
214 c++  c  macos  unix 

8
ซ็อกเก็ตปิด vs ปิด?
ใน C ฉันเข้าใจว่าถ้าเราปิดซ็อกเก็ตหมายความว่าซ็อกเก็ตจะถูกทำลายและสามารถนำกลับมาใช้ใหม่ได้ในภายหลัง วิธีการปิดระบบ? คำอธิบายกล่าวว่าปิดครึ่งหนึ่งของการเชื่อมต่อเพล็กซ์กับซ็อกเก็ตนั้น แต่ซ็อกเก็ตนั้นจะถูกทำลายเหมือนการcloseเรียกของระบบหรือไม่
214 c  sockets  networking 

10
คง const เทียบกับ #define
การใช้static constvars ดีกว่า#definepreprocessor หรือไม่ หรืออาจจะขึ้นอยู่กับบริบท ข้อดี / ข้อเสียของแต่ละวิธีคืออะไร?
212 c++  c  const 

24
ปกป้องปฏิบัติการจากวิศวกรรมย้อนกลับ?
ฉันได้ไตร่ตรองวิธีการป้องกันรหัส C / C ++ ของฉันจากการถอดและวิศวกรรมย้อนกลับ ปกติฉันจะไม่เอาผิดพฤติกรรมนี้ในรหัสของฉัน อย่างไรก็ตามโปรโตคอลปัจจุบันที่ฉันทำงานอยู่นั้นจะต้องไม่ถูกตรวจสอบหรือเข้าใจได้เพื่อความปลอดภัยของผู้คนต่าง ๆ ตอนนี้นี่เป็นเรื่องใหม่สำหรับฉันและอินเทอร์เน็ตไม่ได้มีความเชี่ยวชาญในการป้องกันการย้อนกลับของวิศวกรรมแต่แสดงให้เห็นถึงข้อมูลมากมายเกี่ยวกับวิธีการย้อนกลับวิศวกร บางสิ่งที่ฉันคิดว่าจนถึงตอนนี้คือ: การฉีดโค้ด (การเรียกใช้ฟังก์ชันดัมมี่ก่อนและหลังการเรียกใช้ฟังก์ชันจริง) รหัส obfustication (mangles ถอดแยกชิ้นส่วนของไบนารี) เขียนกิจวัตรการเริ่มต้นของตัวเอง (ยากกว่าสำหรับผู้ debuggers ที่จะผูกไว้) void startup(); int _start() { startup( ); exit (0) } void startup() { /* code here */ } ตรวจสอบ Runtime สำหรับ debuggers (และบังคับให้ออกหากตรวจพบ) ฟังก์ชั่นแทมโพลีน void trampoline(void (*fnptr)(), bool ping …
210 c++  c  obfuscation  assembly 

30
Valgrind ใช้แทน Windows ได้ดีหรือไม่?
ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ฉันกำลังมองหา Valgrind เพื่อช่วยปรับปรุงการเข้ารหัส / การดีบัก C ของฉันเมื่อฉันค้นพบว่ามันเป็นเพียงสำหรับ Linux - ฉันไม่มีความต้องการหรือความสนใจในการย้ายระบบปฏิบัติการของฉันไปยัง Linux ดังนั้นฉันสงสัยว่ามีโปรแกรมที่ดีสำหรับ Windows

11
วิธีการระงับคำเตือน“ พารามิเตอร์ที่ไม่ได้ใช้” ใน C?
ตัวอย่างเช่น Bool NullFunc(const struct timespec *when, const char *who) { return TRUE; } ใน C ++ ฉันสามารถใส่/*...*/ความคิดเห็นรอบพารามิเตอร์ แต่ไม่ได้อยู่ใน C error: parameter name omittedแน่นอนที่มันทำให้ฉันข้อผิดพลาด
210 c  gcc  gcc-warning 

6
typedef array ความยาวคงที่
ฉันต้องกำหนดประเภทข้อมูล 24 บิตฉันใช้char[3]เพื่อแสดงประเภท ฉันสามารถ typedef char[3]เพื่อtype24? ฉันลองในตัวอย่างรหัส ฉันใส่typedef char[3] type24;ไฟล์ส่วนหัว คอมไพเลอร์ไม่ได้บ่นเกี่ยวกับมัน แต่เมื่อฉันกำหนดฟังก์ชั่นvoid foo(type24 val) {}ในไฟล์ C ของฉันมันก็บ่น ฉันต้องการที่จะสามารถที่จะกำหนดฟังก์ชั่นเช่นแทนtype24_to_int32(type24 val)type24_to_int32(char value[3])
210 c  arrays  gcc  typedef 

12
#define macro สำหรับการดีบักการพิมพ์ใน C?
กำลังพยายามสร้างแมโครซึ่งสามารถใช้สำหรับข้อความดีบักการพิมพ์เมื่อกำหนด DEBUG เช่นรหัสเทียมต่อไปนี้: #define DEBUG 1 #define debug_print(args ...) if (DEBUG) fprintf(stderr, args) การทำมาโครนี้ทำได้อย่างไร
209 c  c-preprocessor 

24
วิธีที่จะทำให้กระบวนการเด็กตายหลังจากที่พ่อแม่ออกไป?
สมมติว่าฉันมีกระบวนการที่วางกระบวนการลูกหนึ่งกระบวนการ ตอนนี้เมื่อกระบวนการผู้ปกครองออกจากด้วยเหตุผลใดก็ตาม (ปกติหรือผิดปกติโดยการฆ่า, ^ C, ยืนยันความล้มเหลวหรือสิ่งอื่นใด) ฉันต้องการให้กระบวนการเด็กที่จะตาย ทำอย่างไรให้ถูกต้อง? บางคำถามที่คล้ายกันใน stackoverflow: (ถามก่อนหน้านี้) ฉันจะทำให้กระบวนการเด็กออกเมื่อผู้ปกครองทำอย่างไร (ถามในภายหลัง) กระบวนการลูกสร้างด้วย fork () ถูกฆ่าโดยอัตโนมัติเมื่อแม่ถูกฆ่าหรือไม่ คำถามที่คล้ายกันบางอย่างใน stackoverflow สำหรับWindows : ฉันจะทำลายกระบวนการลูกใน Windows โดยอัตโนมัติได้อย่างไร ฆ่ากระบวนการเด็กเมื่อกระบวนการผู้ปกครองถูกฆ่าตาย
209 c  linux  unix  process  fork 

5
เหตุใดพฤติกรรมที่กำหนดไว้ล้นของจำนวนเต็มล้นที่ไม่ได้ลงนาม แต่ล้นจำนวนเต็มที่ลงนามไม่ได้
จำนวนเต็มมากเกินที่ไม่ได้ลงนามนั้นถูกกำหนดไว้อย่างดีทั้งในมาตรฐาน C และ C ++ ตัวอย่างเช่นมาตรฐาน C99 ( §6.2.5/9) การคำนวณที่เกี่ยวข้องกับตัวถูกดำเนินการที่ไม่ได้ลงนามไม่สามารถเกิน fl ow ได้เนื่องจากผลลัพธ์ที่ไม่สามารถแสดงได้ด้วยประเภทจำนวนเต็มที่ไม่ได้ลงนามผลจะลดลงแบบโมดูโลจำนวนที่มากกว่าหนึ่งค่าที่ใหญ่ที่สุดที่สามารถแสดงด้วยประเภทผลลัพธ์ อย่างไรก็ตามทั้งสองมาตรฐานระบุว่าการโอเวอร์โฟลว์จำนวนเต็มที่ลงนามนั้นเป็นพฤติกรรมที่ไม่ได้กำหนด อีกครั้งจากมาตรฐาน C99 ( §3.4.3/1) ตัวอย่างของพฤติกรรมที่ไม่ได้แก้ไขคือพฤติกรรมของจำนวนเต็มส่วนเกิน มีประวัติศาสตร์หรือ (ดีกว่า!) เหตุผลทางเทคนิคสำหรับความคลาดเคลื่อนนี้หรือไม่?

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