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

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

7
นิยามใหม่ของ NULL
ฉันกำลังเขียนรหัส C สำหรับระบบที่ที่อยู่ 0x0000 ถูกต้องและมีพอร์ต I / O ดังนั้นจุดบกพร่องที่เป็นไปได้ที่เข้าถึงตัวชี้ NULL จะยังคงตรวจไม่พบและในขณะเดียวกันก็ทำให้เกิดพฤติกรรมที่เป็นอันตราย ด้วยเหตุนี้ฉันจึงต้องการกำหนด NULL ใหม่ให้เป็นที่อยู่อื่นตัวอย่างเช่นที่อยู่ที่ไม่ถูกต้อง หากฉันเข้าถึงที่อยู่ดังกล่าวโดยบังเอิญฉันจะได้รับฮาร์ดแวร์ขัดจังหวะซึ่งฉันสามารถจัดการกับข้อผิดพลาดได้ ฉันมีสิทธิ์เข้าถึง stddef.h สำหรับคอมไพเลอร์นี้ดังนั้นฉันจึงสามารถเปลี่ยนส่วนหัวมาตรฐานและกำหนดค่า NULL ใหม่ได้ คำถามของฉันคือสิ่งนี้จะขัดแย้งกับมาตรฐาน C หรือไม่? เท่าที่ฉันสามารถบอกได้จาก 7.17 ในมาตรฐานมาโครถูกกำหนดให้ใช้งานได้ มีอะไรในมาตรฐานที่ระบุว่า NULL ต้องเป็น 0 หรือไม่? ปัญหาอีกประการหนึ่งคือคอมไพเลอร์จำนวนมากดำเนินการเริ่มต้นแบบคงที่โดยตั้งค่าทุกอย่างเป็นศูนย์ไม่ว่าจะเป็นประเภทข้อมูลก็ตาม แม้ว่ามาตรฐานจะบอกว่าคอมไพเลอร์ควรกำหนดจำนวนเต็มเป็นศูนย์และพอยน์เตอร์เป็น NULL ถ้าฉันจะกำหนด NULL ใหม่สำหรับคอมไพเลอร์ของฉันฉันก็รู้ว่าการเริ่มต้นแบบคงที่จะล้มเหลว ฉันสามารถพิจารณาว่าเป็นพฤติกรรมของคอมไพเลอร์ที่ไม่ถูกต้องแม้ว่าฉันจะแก้ไขส่วนหัวของคอมไพเลอร์ด้วยตนเองอย่างกล้าหาญ? เพราะฉันรู้แน่นอนว่าคอมไพเลอร์เฉพาะนี้ไม่เข้าถึงมาโคร NULL เมื่อทำการเริ่มต้นแบบคงที่
118 c  null 

19
มีรูปแบบการใช้งานเครื่องของรัฐโดยทั่วไปหรือไม่?
เราจำเป็นต้องใช้เครื่องของรัฐที่เรียบง่ายในC คำสั่งสวิตช์มาตรฐานเป็นวิธีที่ดีที่สุดหรือไม่? เรามีสถานะปัจจุบัน (สถานะ) และตัวกระตุ้นสำหรับการเปลี่ยนแปลง switch(state) { case STATE_1: state = DoState1(transition); break; case STATE_2: state = DoState2(transition); break; } ... DoState2(int transition) { // Do State Work ... if(transition == FROM_STATE_2) { // New state when doing STATE 2 -> STATE 2 } if(transition == FROM_STATE_1) { // New …

4
# รวมใน. h หรือ. c / .cpp?
เมื่อเข้ารหัสด้วย C หรือ C ++ ฉันควรมี#includeที่ไหน callback.h: #ifndef _CALLBACK_H_ #define _CALLBACK_H_ #include <sndfile.h> #include "main.h" void on_button_apply_clicked(GtkButton* button, struct user_data_s* data); void on_button_cancel_clicked(GtkButton* button, struct user_data_s* data); #endif callback.c: #include <stdlib.h> #include <math.h> #include "config.h" #include "callback.h" #include "play.h" void on_button_apply_clicked(GtkButton* button, struct user_data_s* data) { gint page; page = …
118 c++  c 


11
ฉันจะแก้ไขข้อผิดพลาด GCC“ สำหรับการประกาศเริ่มต้นของลูปที่ใช้นอกโหมด C99” ได้อย่างไร
ฉันกำลังพยายามแก้ปัญหา3n + 1และฉันมีforลูปที่มีลักษณะดังนี้: for(int i = low; i <= high; ++i) { res = runalg(i); if (res > highestres) { highestres = res; } } น่าเสียดายที่ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามรวบรวมกับ GCC: 3np1.c: 15: ข้อผิดพลาด: การประกาศเริ่มต้นของลูป 'สำหรับ' ที่ใช้นอกโหมด C99 ผมไม่รู้ว่าโหมด C99 คืออะไร ความคิดใด ๆ ?
117 c  gcc  for-loop 

4
เหตุใดเราจึงต้องใช้ argc ในขณะที่มีค่าว่างอยู่ท้าย argv เสมอ
ดูเหมือนว่าargv[argc]อยู่เสมอดังนั้นผมคิดว่าเราสามารถสำรวจรายการอาร์กิวเมนต์โดยไม่ต้องNULL ลูปargcเดียวwhileจะทำสิ่งนี้ หากมีการNULLต่อท้ายargvเสมอทำไมเราต้องมีargc?
117 c++  c  main 

12
'const static' หมายถึงอะไรใน C และ C ++
const static int foo = 42; ฉันเห็นสิ่งนี้ในโค้ดบางอย่างที่นี่ใน StackOverflow และฉันคิดไม่ออกว่ามันทำอะไร จากนั้นฉันก็เห็นคำตอบที่สับสนในฟอรัมอื่น ๆ ฉันเดาได้ดีที่สุดคือใช้ใน C เพื่อซ่อนค่าคงที่fooจากโมดูลอื่น ๆ ถูกต้องหรือไม่ ถ้าเป็นเช่นนั้นทำไมทุกคนถึงใช้มันในบริบท C ++ ซึ่งคุณสามารถทำได้private?
117 c++  c 

5
ข้อผิดพลาด: ใช้ไลบรารี Libtool แต่ไม่ได้กำหนด 'LIBTOOL'
ฉันพยายามautomakeใช้ไลบรารี OrientDb C ++ แต่ได้รับข้อผิดพลาดบางอย่าง Makefile.am:10: error: Libtool library used but 'LIBTOOL' is undefined Makefile.am:10: The usual way to define 'LIBTOOL' is to add 'LT_INIT' Makefile.am:10: to 'configure.ac' and run 'aclocal' and 'autoconf' again. Makefile.am:10: If 'LT_INIT' is in 'configure.ac', make sure Makefile.am:10: its definition is in aclocal's search path. …
117 c  linux  autotools  orientdb 

11
ความหมายของรหัสข้อยกเว้น“ EXC_I386_GPFLT” คืออะไร?
ความหมายของรหัสข้อยกเว้นEXC_I386_GPFLTคืออะไร? ความหมายแตกต่างกันไปตามสถานการณ์หรือไม่? ในกรณีนั้นฉันหมายถึงประเภทEXC_BAD_ACCESSข้อยกเว้นที่มีรหัสข้อยกเว้นEXC_I386_GPFLT โปรแกรมได้รับการพัฒนาใน Xcode 5.0.1 ซึ่งเกี่ยวข้องกับcblas_zgemm()ไลบรารี BLAS (ฉันเดาว่ามันไม่สำคัญ ... ) ขอบคุณมาก!
117 c++  c  exc-bad-access 

5
วิธีใช้หน่วยความจำร่วมกับ Linux ในภาษา C
ฉันมีปัญหาเล็กน้อยกับหนึ่งในโครงการของฉัน ฉันพยายามค้นหาตัวอย่างที่มีการบันทึกไว้เป็นอย่างดีเกี่ยวกับการใช้หน่วยความจำที่ใช้ร่วมกันfork()แต่ไม่ประสบความสำเร็จ โดยทั่วไปสถานการณ์คือเมื่อผู้ใช้เริ่มโปรแกรมฉันจำเป็นต้องเก็บค่าสองค่าในหน่วยความจำที่ใช้ร่วมกัน: current_pathซึ่งเป็นถ่าน *และfile_nameซึ่งเป็นchar *ด้วย ขึ้นอยู่กับอาร์กิวเมนต์ของคำสั่งกระบวนการใหม่จะเริ่มต้นด้วยfork()และกระบวนการนั้นจำเป็นต้องอ่านและแก้ไขตัวแปรcurrent_path ที่จัดเก็บในหน่วยความจำแบบแบ่งใช้ในขณะที่ตัวแปรfile_nameอ่านได้อย่างเดียว มีคำแนะนำที่ดีเกี่ยวกับหน่วยความจำที่ใช้ร่วมกันพร้อมรหัสตัวอย่าง (ถ้าเป็นไปได้) ที่คุณสามารถแนะนำฉันได้ไหม
117 c  linux  fork  shared-memory 

30
ข้อ จำกัด C ++ เป็นอย่างไรเมื่อเทียบกับภาษา C? [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ต่อไปนี้เป็นประโยชน์ของ C ++ C ++ มีคุณสมบัติเฉพาะที่พวกเขาถามถึง คอมไพเลอร์ C ของพวกเขาเกือบจะเป็นคอมไพเลอร์ C ++ จริงๆดังนั้นจึงไม่มีผลกระทบด้านต้นทุนซอฟต์แวร์ C ++ นั้นพกพาได้เช่นเดียวกับ C โค้ด C ++ สามารถมีประสิทธิภาพเท่ากับ C (หรือมากกว่านั้นหรือน้อยกว่านั้นก็ได้) มีเหตุผลที่เป็นรูปธรรมและสถานการณ์เฉพาะที่ต้องใช้ C มากกว่า C ++ หรือไม่? อ้างอิงถึงคำถามนี้: Library for generics in C ไม่ซ้ำกันเนื่องจากคำถามนี้ถามเกี่ยวกับข้อ จำกัด ด้านภาษาและไม่เกี่ยวกับควร / ไม่ควรเรียนรู้ภาษาหนึ่งกับอีกภาษาหนึ่ง โพสต์ของ Peter …
116 c++  c 

14
ฉันควรเรียนภาษา C ก่อนเรียน C ++ หรือไม่? [ปิด]
ตามที่กล่าวไว้ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา วันนี้ฉันไปเยี่ยมแผนก CS ของมหาวิทยาลัยและในการทัวร์ห้องแล็บเราได้นั่งลงเล่นกับโครงการปีสุดท้ายสองสามโครงการจากนักศึกษาระดับปริญญาตรี สิ่งหนึ่งที่ดีเป็นพิเศษ - เกมดาวเคราะห์น้อยประเภท FPS ฉันตัดสินใจที่จะดูในsrcไดเรกทอรีเพื่อพบว่ามันทำใน C ++ (โครงการอื่น ๆ ส่วนใหญ่เป็นแอป Java 3D) ฉันไม่เคยทำ C มาก่อน แต่ฉันเคยดูรหัส C มาก่อนแล้ว จากที่ผมเห็นรหัส. cpp ในเกมนี้ดูไม่แตกต่างกันมาก ฉันสนใจที่จะเรียนรู้ C หรือ C ++ แต่อาจจะเรียนรู้อย่างอื่นในภายหลัง มีข้อได้เปรียบสำหรับการเรียนรู้ก่อนอื่นหรือไม่และถ้าเป็นเช่นนั้นข้อใด
116 c++  c 

30
แนวทางปฏิบัติในการเข้ารหัสซึ่งช่วยให้คอมไพเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโปรแกรมได้เร็วขึ้น
หลายปีก่อนคอมไพเลอร์ C ไม่ค่อยฉลาดนัก ในฐานะที่เป็นวิธีแก้ปัญหา K&R ได้คิดค้นคีย์เวิร์ดregisterเพื่อบอกใบ้ถึงคอมไพเลอร์ว่าอาจเป็นความคิดที่ดีที่จะเก็บตัวแปรนี้ไว้ในรีจิสเตอร์ภายใน พวกเขายังสร้างตัวดำเนินการระดับอุดมศึกษาเพื่อช่วยสร้างรหัสที่ดีขึ้น เมื่อเวลาผ่านไปคอมไพเลอร์ก็ครบกำหนด พวกเขาฉลาดมากที่การวิเคราะห์โฟลว์ช่วยให้ตัดสินใจได้ดีขึ้นเกี่ยวกับค่าที่จะเก็บไว้ในรีจิสเตอร์มากกว่าที่คุณจะทำได้ คีย์เวิร์ด register ไม่สำคัญ FORTRAN อาจเร็วกว่า C สำหรับการดำเนินการบางประเภทเนื่องจากปัญหานามแฝง ในทางทฤษฎีด้วยการเข้ารหัสอย่างรอบคอบเราสามารถหลีกเลี่ยงข้อ จำกัด นี้เพื่อให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสที่เร็วขึ้น มีแนวทางปฏิบัติในการเข้ารหัสอะไรบ้างที่อาจทำให้คอมไพลเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโค้ดได้เร็วขึ้น การระบุแพลตฟอร์มและคอมไพเลอร์ที่คุณใช้จะได้รับการชื่นชม ทำไมเทคนิคนี้ดูเหมือนจะใช้ได้ผล? ขอแนะนำโค้ดตัวอย่าง นี่คือคำถามที่เกี่ยวข้อง [แก้ไข] คำถามนี้ไม่เกี่ยวกับกระบวนการโดยรวมในการสร้างโปรไฟล์และเพิ่มประสิทธิภาพ สมมติว่าโปรแกรมได้รับการเขียนอย่างถูกต้องรวบรวมด้วยการเพิ่มประสิทธิภาพเต็มรูปแบบทดสอบและนำไปใช้ในการผลิต อาจมีโครงสร้างในโค้ดของคุณที่ห้ามไม่ให้เครื่องมือเพิ่มประสิทธิภาพทำงานให้ดีที่สุดเท่าที่จะทำได้ คุณสามารถทำอะไรได้บ้างในการ refactor ที่จะลบข้อห้ามเหล่านี้และอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสได้เร็วขึ้น [แก้ไข] ลิงก์ที่เกี่ยวข้องกับออฟเซ็ต

3
ทำไม main ไม่คืนค่า 0 ที่นี่?
ฉันเพิ่งอ่าน ร่างคณะกรรมการ ISO / IEC 9899: 201x - 12 เมษายน 2554 ซึ่งฉันพบภายใต้ 5.1.2.2.3 การยุติโปรแกรม ..reaching the } that terminates the main function returns a value of 0. หมายความว่าหากคุณไม่ได้ระบุคำสั่งส่งคืนใด ๆ ในmain()และหากโปรแกรมทำงานได้สำเร็จที่วงเล็บปีกกาปิด} ของ main จะส่งกลับ 0 แต่ในรหัสต่อไปนี้ฉันไม่ได้ระบุคำสั่งส่งคืนใด ๆ แต่ก็ไม่ส่งคืน 0 #include<stdio.h> int sum(int a,int b) { return (a + b); } int …
116 c  linux  return  main 

12
การต่อ const char *
ฉันต้องการเชื่อมอักขระ const สองตัวเข้าด้วยกันดังนี้: const char *one = "Hello "; const char *two = "World"; ฉันจะทำอย่างนั้นได้อย่างไร? ฉันส่งผ่านสิ่งเหล่านี้char*มาจากไลบรารีของบุคคลที่สามที่มีอินเทอร์เฟซ C ดังนั้นฉันจึงไม่สามารถใช้std::stringแทนได้

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