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

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

7
สถาปัตยกรรมที่แปลกใหม่ที่คณะกรรมการมาตรฐานใส่ใจ
ฉันรู้ว่ามาตรฐาน C และ C ++ ออกจากแง่มุมต่าง ๆ ของการใช้งานภาษาที่กำหนดเพราะถ้ามีสถาปัตยกรรมที่มีคุณสมบัติอื่น ๆ มันจะยากมากหรือเป็นไปไม่ได้ที่จะเขียนคอมไพเลอร์ที่สอดคล้องกับมาตรฐาน ฉันรู้ว่า 40 ปีที่แล้วคอมพิวเตอร์เครื่องใดมีคุณสมบัติเฉพาะของตัวเอง อย่างไรก็ตามฉันไม่รู้สถาปัตยกรรมที่ใช้ในปัจจุบันที่: CHAR_BIT != 8 signed ไม่ใช่สองส่วน (ฉันได้ยินว่า Java มีปัญหากับอันนี้) จุดลอยตัวไม่เป็นไปตามมาตรฐาน IEEE 754 (แก้ไข: ฉันหมายถึง "ไม่ได้อยู่ในการเข้ารหัสแบบไบนารีของ IEEE 754") เหตุผลที่ฉันขอคือว่าผมมักจะอธิบายให้คนที่เป็นของดีที่ C ++ ไม่อาณัติด้านระดับต่ำอื่น ๆ เช่นประเภทขนาดคง† มันดีเพราะไม่เหมือน 'ภาษาอื่น ๆ ' เพราะมันทำให้โค้ดของคุณพกพาได้เมื่อใช้อย่างถูกต้อง (แก้ไข: เนื่องจากมันสามารถย้ายไปยังสถาปัตยกรรมอื่น ๆ ได้โดยไม่ต้องจำลองด้านต่ำของเครื่องเช่นเช่นเลขคณิตสองส่วนของเครื่องหมาย + สถาปัตยกรรมขนาด) . แต่ฉันรู้สึกแย่ที่ฉันไม่สามารถชี้ไปที่สถาปัตยกรรมเฉพาะได้ด้วยตัวเอง ดังนั้นคำถามคือสถาปัตยกรรมใดที่แสดงคุณสมบัติข้างต้น …
154 c++  c  architecture 


6
NSLog ชื่อวิธีการด้วย Objective-C ใน iPhone
ขณะนี้เรากำลังกำหนดกลไกการบันทึกเพิ่มเติมเพื่อพิมพ์ชื่อคลาสและหมายเลขบรรทัดซอร์สของบันทึก #define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \ __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__]) ตัวอย่างเช่นเมื่อฉันโทร NCLog (@ "Hello world"); ผลลัพธ์จะเป็น: <ApplicationDelegate:10>Hello world ตอนนี้ฉันต้องการออกจากระบบชื่อวิธีเช่น: <ApplicationDelegate:applicationDidFinishLaunching:10>Hello world ดังนั้นสิ่งนี้จะทำให้การดีบักของเราง่ายขึ้นเมื่อเรารู้วิธีการที่เรียกใช้ ฉันรู้ว่าเรามี Xcode debugger ด้วย แต่บางครั้งฉันก็อยากทำการดีบั๊กด้วยการออกจากระบบ

11
~ x + ~ y == ~ (x + y) เป็นเท็จเสมอหรือไม่
รหัสนี้ประเมินว่าเป็นเท็จเสมอหรือไม่ ตัวแปรทั้งสองเป็นส่วนเสริมที่มีการลงนามของทั้งสอง ~x + ~y == ~(x + y) ฉันรู้สึกว่าควรมีจำนวนที่ตรงกับเงื่อนไข ฉันลองทดสอบตัวเลขระหว่าง-5000และ5000ไม่เคยประสบความเท่าเทียมกัน มีวิธีการตั้งค่าสมการเพื่อหาคำตอบให้กับเงื่อนไขหรือไม่? การสลับหนึ่งรายการสำหรับอีกรายการหนึ่งจะทำให้เกิดข้อบกพร่องที่ร้ายกาจในโปรแกรมของฉันหรือไม่

9
ใน C เครื่องหมายวงเล็บทำหน้าที่เป็นกรอบสแต็กหรือไม่
หากฉันสร้างตัวแปรภายในวงเล็บปีกกาชุดใหม่ตัวแปรนั้นจะแตกออกจากสแต็กในวงเล็บปิดหรือไม่หรือจะออกไปเที่ยวจนจบฟังก์ชัน ตัวอย่างเช่น: void foo() { int c[100]; { int d[200]; } //code that takes a while return; } จะdใช้หน่วยความจำระหว่างcode that takes a whileส่วนหรือไม่
153 c  memory  stack 

9
“ การติดต่อกลับ” ใน C คืออะไรและนำไปใช้อย่างไร
จากการอ่านที่ฉันทำไปแล้ว Core Audio ต้องอาศัยการเรียกกลับอย่างหนัก (และ C ++ แต่นั่นเป็นอีกเรื่องหนึ่ง) ฉันเข้าใจแนวคิด (เรียงลำดับ) ของการตั้งค่าฟังก์ชันที่เรียกใช้โดยฟังก์ชันอื่นซ้ำ ๆ เพื่อให้งานสำเร็จ ฉันไม่เข้าใจวิธีการตั้งค่าและวิธีการใช้งานจริง ตัวอย่างใด ๆ ที่จะได้รับการชื่นชม
153 c  callback 

14
กำลังตรวจหาตัวชี้ NULL ใน C / C ++ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ในการตรวจสอบโค้ดเมื่อเร็ว ๆ นี้ผู้ให้ข้อมูลพยายามบังคับให้การNULLตรวจสอบพอยน์เตอร์ทั้งหมดดำเนินการในลักษณะดังต่อไปนี้: int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } แทน int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } …

13
มีเครื่องมืออะไรบ้างสำหรับการเขียนโปรแกรมการทำงานใน C
ฉันได้คิดมากเกี่ยวกับวิธีการทำโปรแกรมฟังก์ชั่นใน C ( ไม่ใช่ C ++) เห็นได้ชัดว่า C เป็นภาษาขั้นตอนและไม่สนับสนุนการเขียนโปรแกรมเชิงฟังก์ชันจริงๆ มีส่วนขยายคอมไพเลอร์ / ภาษาที่เพิ่มโครงสร้างการเขียนโปรแกรมการทำงานบางอย่างให้กับภาษาหรือไม่ GCC มีฟังก์ชั่นที่ซ้อนกันเป็นส่วนขยายภาษา ฟังก์ชั่นที่ซ้อนกันสามารถเข้าถึงตัวแปรจากเฟรมหลักของสแต็กหลักได้ ตัวอย่างเช่นสิ่งหนึ่งที่ฉันคิดว่าอาจมีประโยชน์จริง ๆ ใน C คือที่ใดก็ตามที่คาดว่าจะมีตัวชี้ฟังก์ชั่นคุณสามารถส่งผ่านการแสดงออกแลมบ์ดา C ++ 0x กำลังจะรวมแลมบ์ดานิพจน์ (ซึ่งฉันคิดว่ามันยอดเยี่ยม); อย่างไรก็ตามฉันกำลังมองหาเครื่องมือที่ใช้กับ C ตรง [แก้ไข] เพื่อชี้แจงฉันไม่พยายามแก้ปัญหาเฉพาะใน C ที่เหมาะกับการเขียนโปรแกรมการทำงานมากกว่า ฉันแค่อยากรู้เกี่ยวกับเครื่องมือที่ออกมีถ้าฉันต้องการที่จะทำ

13
num ++ สามารถเป็นอะตอมสำหรับ 'int num' ได้หรือไม่
โดยทั่วไปสำหรับint num, num++(หรือ++num), ในฐานะการดำเนินการอ่าน - แก้ไข - การเขียนไม่ได้เป็นอะตอมมิก แต่ฉันมักจะเห็นคอมไพเลอร์เช่นGCCสร้างรหัสต่อไปนี้ ( ลองที่นี่ ): ตั้งแต่บรรทัดที่ 5 ซึ่งสอดคล้องกับnum++คำสั่งเดียวเราสามารถสรุปได้ว่าnum++ เป็นอะตอมในกรณีนี้หรือไม่? และถ้าเป็นเช่นนั้นหมายความว่าสิ่งที่สร้างขึ้นnum++สามารถนำมาใช้ในสถานการณ์พร้อมกัน (มัลติเธรด) โดยไม่มีอันตรายจากการแข่งขันของข้อมูล (เช่นเราไม่จำเป็นต้องทำตัวอย่างเช่นstd::atomic<int>และกำหนดค่าใช้จ่ายที่เกี่ยวข้องเนื่องจากเป็น ปรมาณูอยู่แล้ว)? UPDATE โปรดสังเกตว่าคำถามนี้ไม่ใช่ว่าการเพิ่มขึ้นเป็นอะตอมหรือไม่ (ไม่ใช่และนั่นคือและเป็นบรรทัดเปิดของคำถาม) มันอาจเป็นได้ในบางสถานการณ์หรือไม่เช่นในกรณีที่ใช้คำสั่งเดียวสามารถใช้เพื่อหลีกเลี่ยงค่าใช้จ่ายของlockคำนำหน้า และในฐานะที่เป็นคำตอบที่ได้รับการยอมรับกล่าวถึงในส่วนที่เกี่ยวกับเครื่องประมวลผลเดียวเช่นเดียวกับคำตอบนี้การสนทนาในความคิดเห็นและอื่น ๆ อธิบายว่ามันสามารถ (แม้ว่าจะไม่ใช่กับ C หรือ C ++)

8
กลับอาร์เรย์โดยใช้ C
ฉันค่อนข้างใหม่กับ C และฉันต้องการความช่วยเหลือเกี่ยวกับวิธีการจัดการกับอาร์เรย์ มาจากการเขียนโปรแกรม Java ฉันคุ้นเคยกับความสามารถในการพูดint [] method()เพื่อส่งกลับอาร์เรย์ อย่างไรก็ตามฉันพบว่าด้วย C คุณต้องใช้พอยน์เตอร์สำหรับอาร์เรย์เมื่อคุณส่งคืน ในฐานะโปรแกรมเมอร์คนใหม่ฉันไม่เข้าใจเลยแม้แต่เรื่องที่ฉันได้ดูมา โดยทั่วไปฉันพยายามเขียนวิธีที่ส่งกลับอาร์เรย์ char ใน C. ฉันจะให้วิธีการ (ให้เรียกมันว่า returnArray) กับอาร์เรย์ มันจะสร้างอาร์เรย์ใหม่จากอาร์เรย์ก่อนหน้าและส่งกลับตัวชี้ไปยังมัน ฉันแค่ต้องการความช่วยเหลือเกี่ยวกับวิธีการเริ่มต้นนี้และวิธีการอ่านตัวชี้เมื่อมันถูกส่งออกจากอาร์เรย์ ความช่วยเหลือใด ๆ ที่อธิบายสิ่งนี้ยินดี รูปแบบรหัสที่เสนอสำหรับฟังก์ชันส่งคืนอาร์เรย์ char *returnArray(char array []){ char returned [10]; //methods to pull values from array, interpret them, and then create new array return &(returned[0]); //is this …
153 c  arrays  pointers  char 

2
วิธีเชื่อมต่อสองครั้งด้วยตัวประมวลผลล่วงหน้า C และขยายแมโครดังเช่นใน“ arg ## _ ## MACRO”
ฉันพยายามเขียนโปรแกรมที่ชื่อของฟังก์ชั่นบางอย่างขึ้นอยู่กับค่าของตัวแปรมาโครที่มีมาโครเช่นนี้ #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); น่าเสียดายที่แมโครNAME()กลายเป็นสิ่งนั้น int some_function_VARIABLE(int a); ค่อนข้างมากกว่า int some_function_3(int a); ดังนั้นนี่เป็นวิธีที่ผิดอย่างชัดเจนที่จะไปเกี่ยวกับมัน โชคดีที่จำนวนของค่าที่เป็นไปได้ที่แตกต่างกันสำหรับ VARIABLE มีขนาดเล็กดังนั้นฉันจึงสามารถทำ#if VARIABLE == nและแยกรายการเคสทั้งหมด แต่ฉันสงสัยว่ามีวิธีที่ชาญฉลาดในการทำหรือไม่

4
“ #define _GNU_SOURCE” หมายถึงอะไร
วันนี้ฉันต้องใช้basename()ฟังก์ชั่นและman 3 basename( ที่นี่ ) ให้ข้อความแปลก ๆ แก่ฉัน: หมายเหตุ มีbasenameสองเวอร์ชันที่แตกต่างกัน- เวอร์ชันPOSIX ที่อธิบายไว้ข้างต้นและเวอร์ชัน GNUซึ่งเวอร์ชันหนึ่งได้รับหลังจาก #define _GNU_SOURCE #include <string.h> ฉันสงสัยว่าสิ่งที่นี้#define _GNU_SOURCEหมายถึง: มันtaintingที่ผมเขียนโค้ดที่มีใบอนุญาต GNU เกี่ยวข้อง? หรือจะเป็นเพียงแค่ใช้ในการบอกสิ่งที่คอมไพเลอร์เช่น " ดีฉันรู้ว่าชุดของฟังก์ชั่นนี้ไม่ได้เป็น POSIX จึงไม่ได้พกพา แต่ผมอยากจะใช้มันต่อไป " ถ้าเป็นเช่นนั้นทำไมไม่ให้คนส่วนหัวที่แตกต่างกันแทนที่จะต้องกำหนดแมโครที่คลุมเครือเพื่อรับฟังก์ชั่นหนึ่งหรืออีกอันหนึ่ง? มีข้อบกพร่องบางอย่างสำหรับฉันด้วย: คอมไพเลอร์รู้ได้อย่างไรว่าการใช้งานฟังก์ชั่นใดเพื่อเชื่อมโยงกับปฏิบัติการ? มันใช้สิ่งนี้#defineด้วยหรือไม่ ใครมีพอยน์เตอร์ให้ฉันบ้าง
152 c  posix  gnu 

22
การจัดการข้อผิดพลาดในรหัส C
สิ่งใดที่คุณพิจารณาว่า "แนวปฏิบัติที่ดีที่สุด" เมื่อพูดถึงข้อผิดพลาดในการจัดการข้อผิดพลาดด้วยวิธีที่สอดคล้องกันในไลบรารี C มีสองวิธีที่ฉันคิดถึง: ส่งคืนรหัสข้อผิดพลาดเสมอ ฟังก์ชั่นทั่วไปจะมีลักษณะเช่นนี้: MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize); วิธีการระบุข้อผิดพลาดตัวชี้: int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError); เมื่อใช้วิธีแรกเป็นไปได้ที่จะเขียนโค้ดเช่นนี้ซึ่งมีการตรวจสอบข้อผิดพลาดในการเรียกใช้ฟังก์ชันโดยตรง: int size; if(getObjectSize(h, &size) != MYAPI_SUCCESS) { // Error handling } ซึ่งดูดีกว่ารหัสการจัดการข้อผิดพลาดที่นี่ MYAPIError error; int size; size = getObjectSize(h, &error); if(error != MYAPI_SUCCESS) { // Error handling } อย่างไรก็ตามฉันคิดว่าการใช้ค่าส่งคืนสำหรับการส่งคืนข้อมูลทำให้โค้ดอ่านง่ายขึ้นเห็นได้ชัดว่ามีบางสิ่งเขียนไปยังตัวแปรขนาดในตัวอย่างที่สอง คุณมีความคิดเห็นเกี่ยวกับสาเหตุที่ฉันควรเลือกวิธีใดวิธีหนึ่งเหล่านั้นหรืออาจผสมพวกเขาหรือใช้อย่างอื่น? ฉันไม่ได้เป็นแฟนตัวยงของข้อผิดพลาดระดับโลกเนื่องจากมันมีแนวโน้มที่จะทำให้การใช้งานแบบมัลติเธรดของห้องสมุดเป็นไปอย่างเจ็บปวดยิ่งขึ้น …
152 c  error-handling 

7
มันปลอดภัยที่จะแยก / a / proc / ไฟล์?
ฉันต้องการแยกวิเคราะห์/proc/net/tcp/แต่ปลอดภัยหรือไม่ ฉันจะเปิดและอ่านไฟล์จาก/proc/และไม่ต้องกลัวว่ากระบวนการอื่น ๆ (หรือระบบปฏิบัติการของตัวเอง) จะเปลี่ยนแปลงในเวลาเดียวกันได้อย่างไร
152 c++  c  linux  unix  procfs 

8
__stdcall คืออะไร
ฉันเรียนรู้เกี่ยวกับการเขียนโปรแกรม Win32 และWinMainต้นแบบดูเหมือนว่า: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show ) ฉันสับสนว่าWINAPIตัวระบุนี้ใช้สำหรับอะไรและพบว่า: #define WINAPI __stdcall สิ่งนี้ทำอะไร ฉันสับสนโดยการมีบางอย่างหลังจากกลับมาประเภท มี__stdcallไว้เพื่ออะไร มันหมายความว่าอย่างไรเมื่อมีบางอย่างระหว่างชนิดที่ส่งคืนและชื่อฟังก์ชัน

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