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

C เป็นภาษาโปรแกรมคอมพิวเตอร์ทั่วไปที่ใช้สำหรับระบบปฏิบัติการเกมและงานที่มีประสิทธิภาพสูงอื่น ๆ

6
เหตุใดบางโปรแกรม C เขียนในไฟล์ต้นฉบับขนาดใหญ่?
ตัวอย่างเช่นเครื่องมือSysInternals "FileMon" จากอดีตมีไดรเวอร์โหมดเคอร์เนลที่มีซอร์สโค้ดทั้งหมดในไฟล์ 4,000 บรรทัด เช่นเดียวกันสำหรับโปรแกรม ping แรกที่เคยเขียน (~ 2,000 LOC)
88 design  c  source-code 

8
จะดีกว่าการทำเอกสารฟังก์ชั่นในไฟล์ส่วนหัวหรือไฟล์ต้นฉบับ?
ในภาษาที่แยกความแตกต่างระหว่างไฟล์ "แหล่งที่มา" และ "ส่วนหัว" (ส่วนใหญ่ C และ C ++) จะดีกว่าฟังก์ชั่นเอกสารในไฟล์ส่วนหัวหรือไม่: (ขโมยจากCCAN ) /** * time_now - return the current time * * Example: * printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec); */ struct timeval time_now(void); หรือในไฟล์ต้นฉบับ? (ขโมยจาก PostgreSQL) /* * Convert a UTF-8 character to a Unicode code point. * …
86 c++  c  headers 

19
ทำไม OCaml จึงไม่เป็นที่นิยมมากกว่า?
ผมเคยได้ยินเสมอว่าซีเป็นภาษาของทางเลือกที่จะใช้สำหรับระบบฝังตัวหรือสิ่งที่ต้องการที่จะทำงานที่ความเร็วสูงสุด ฉันไม่เคยพัฒนาความชื่นชอบให้กับ C ส่วนใหญ่เป็นเพราะฉันไม่ชอบเลขคณิตของตัวชี้และภาษาแทบจะไม่ดังไปกว่าแอสเซมเบลอร์ ในทางตรงกันข้ามภาษา ML นั้นใช้งานได้ภาษาที่รวบรวมขยะและ OCaml มีรูปแบบวัตถุ แต่พวกเขาก็มีชื่อเสียงในด้านความรวดเร็วเท่ากับภาษา C. ML มีสิ่งที่เป็นนามธรรมทุกคนสามารถขอให้เขียนในระดับสูงกระชับ รหัส แต่ยังคงความเร็วที่จำเป็นสำหรับการเขียนแอปพลิเคชันประสิทธิภาพสูง โดยเฉพาะอย่างยิ่ง OCaml สามารถใช้งานได้ทุกที่ที่ C ใช้แบบดั้งเดิมเช่นสำหรับอุปกรณ์ฝังตัว, ไดรเวอร์กราฟิก, ระบบปฏิบัติการ ฯลฯ โดยสิทธิทั้งหมด OCaml ควรจะครองโลก แต่ตอนนี้แทบไม่มีใครได้ยินภาษา แต่เพียงผู้เดียว ใช้มัน นี่เป็นคำถามแบบอัตนัย แต่ทำไมภาษาอื่นของ OCaml และ ML ยังคงคลุมเครือในขณะที่ภาษา C และภาษาอื่น ๆ ได้รับความนิยม
86 c  ocaml 

8
เหตุใดจึงต้องใช้การขึ้นบรรทัดใหม่แทนที่จะนำหน้าด้วย printf
printfผมได้ยินมาว่าคุณควรหลีกเลี่ยงการขึ้นบรรทัดใหม่ชั้นนำเมื่อใช้ ดังนั้นแทนที่จะprintf("\nHello World!")ใช้printf("Hello World!\n") ในตัวอย่างข้างต้นนี้ไม่สมเหตุสมผลเนื่องจากเอาต์พุตจะแตกต่างกัน แต่ให้พิจารณาสิ่งนี้: printf("Initializing"); init(); printf("\nProcessing"); process_data(); printf("\nExiting"); เปรียบเทียบกับ: printf("Initializing\n"); init(); printf("Processing\n"); process_data(); printf("Exiting"); ฉันไม่เห็นประโยชน์ใด ๆ จากการขึ้นบรรทัดใหม่ยกเว้นว่าจะดูดีขึ้น มีเหตุผลอื่นอีกไหม? แก้ไข: ฉันจะอยู่คะแนนปิดที่นี่และตอนนี้ ฉันไม่คิดว่านี่เป็นของล้นล้นเพราะคำถามนี้ส่วนใหญ่เกี่ยวกับการออกแบบ ฉันก็จะบอกว่าถึงแม้มันอาจเป็นความคิดเห็นต่อเรื่องนี้คำตอบของ Kilian Fothและคำตอบของอาจารย์ก็พิสูจน์ให้เห็นว่ามีประโยชน์อย่างแท้จริงกับวิธีการหนึ่ง
79 c 

5
เหตุใดจึงไม่มีระบบการจัดการแพ็คเกจสำหรับ C และ C ++ [ปิด]
มีภาษาการเขียนโปรแกรมบางอย่างซึ่งมีอยู่ในระบบการจัดการบรรจุภัณฑ์: CTANสำหรับ TeX CPANสำหรับ Perl Pip & Eggsสำหรับ Python Mavenสำหรับ Java พันธมิตรสำหรับ Haskell อัญมณีสำหรับทับทิม npmสำหรับ NodeJS bowerสำหรับ Javascript & CSS ส่วนหน้า นักเก็ตสำหรับ C # นักแต่งเพลงสำหรับ PHP มีภาษาอื่นที่ใช้ระบบดังกล่าวหรือไม่? แล้ว C และ C ++ ล่ะ? (นั่นเป็นคำถามหลัก!) ทำไมไม่มีระบบดังกล่าวสำหรับพวกเขา? และไม่ได้มีการสร้างแพคเกจสำหรับyum, apt-getหรือระบบการจัดการแพคเกจอื่น ๆ ทั่วไปดีขึ้นหรือไม่
78 c++  c  builds  packages 

20
การแทนที่รหัสที่ได้รับการปรับปรุงด้วยรหัสที่อ่านได้นั้นเป็นเรื่องปกติหรือไม่
บางครั้งคุณพบสถานการณ์ที่คุณต้องขยาย / ปรับปรุงบางรหัสที่มีอยู่ คุณจะเห็นว่ารหัสเก่านั้นผอมมาก แต่มันก็ยากที่จะขยายและใช้เวลาในการอ่าน มันเป็นความคิดที่ดีที่จะแทนที่ด้วยรหัสที่ทันสมัย? ก่อนหน้านี้ฉันชอบวิธีการแบบลีน แต่ตอนนี้ฉันคิดว่ามันจะดีกว่าถ้าเสียสละจำนวนมากเพื่อเพิ่มประสิทธิภาพให้กับ abstractions ที่สูงขึ้นอินเตอร์เฟสที่ดีขึ้นและโค้ดที่อ่านได้และสามารถขยายได้มากขึ้น คอมไพเลอร์ดูเหมือนว่าจะเริ่มดีขึ้นเช่นกันดังนั้นสิ่งต่าง ๆ เช่นstruct abc = {}กลายเป็นเงียบ ๆmemset, shared_ptrs ค่อนข้างผลิตรหัสเดียวกันเป็นตัวชี้ดิบ twiddling, แม่แบบทำงานได้ดีสุดเพราะพวกเขาผลิตรหัสซุปเปอร์ลีนและอื่น ๆ แต่ถึงกระนั้นบางครั้งคุณก็เห็นอาร์เรย์ตามสแต็กและฟังก์ชั่น C เก่าที่มีตรรกะคลุมเครือและมักจะไม่ได้อยู่ในเส้นทางที่สำคัญ เป็นความคิดที่ดีที่จะเปลี่ยนรหัสดังกล่าวถ้าคุณต้องสัมผัสชิ้นส่วนเล็ก ๆ ด้วยวิธีใด?

10
ทำไมอาร์เรย์ C ถึงไม่ติดตามความยาวของมัน
อะไรคือเหตุผลที่อยู่เบื้องหลังไม่แน่ชัดเก็บความยาวของอาร์เรย์กับอาร์เรย์ในC? วิธีที่ฉันเห็นมันมีเหตุผลมากมายที่ต้องทำเช่นนั้นแต่มีไม่มากนักในการสนับสนุนมาตรฐาน (C89) ตัวอย่างเช่น การมีความยาวที่มีอยู่ในบัฟเฟอร์สามารถป้องกันไม่ให้บัฟเฟอร์มีค่าเกินได้ สไตล์ Java arr.lengthมีทั้งชัดเจนและหลีกเลี่ยงโปรแกรมเมอร์จากการรักษาจำนวนมากintในกองหากจัดการกับหลายอาร์เรย์ พารามิเตอร์ฟังก์ชั่นกลายเป็นจุดศูนย์กลางมากขึ้น แต่บางทีเหตุผลที่จูงใจที่สุดในความคิดของฉันก็คือโดยปกติแล้วจะไม่มีการบันทึกที่ว่างหากไม่รักษาความยาว ฉันอยากจะบอกว่าการใช้อาร์เรย์ส่วนใหญ่เกี่ยวข้องกับการจัดสรรแบบไดนามิก จริงอาจมีบางกรณีที่ผู้คนใช้อาร์เรย์ที่จัดสรรในสแต็ก แต่นั่นเป็นเพียงการเรียกใช้ฟังก์ชันเดียว * - สแต็กสามารถจัดการ 4 หรือ 8 ไบต์พิเศษได้ เนื่องจากตัวจัดการฮีปต้องติดตามขนาดบล็อกว่างที่ใช้โดยอาร์เรย์ที่จัดสรรแบบไดนามิกอยู่แล้วเหตุใดจึงไม่ทำให้ข้อมูลนั้นสามารถใช้งานได้ (และเพิ่มกฎเพิ่มเติมตรวจสอบ ณ เวลาคอมไพล์ซึ่งไม่สามารถจัดการความยาวได้อย่างชัดเจน ชอบยิงตัวเองด้วยการเดินเท้า) สิ่งเดียวที่ฉันคิดได้ในอีกด้านหนึ่งคือการติดตามความยาวอาจทำให้คอมไพเลอร์เรียบง่ายขึ้น แต่ไม่ง่ายกว่านั้นมากนัก * ในทางเทคนิคเราสามารถเขียนฟังก์ชั่นแบบเรียกซ้ำด้วยอาเรย์ที่มีที่จัดเก็บอัตโนมัติและในกรณีนี้ (ที่ซับซ้อนมาก) การจัดเก็บความยาวอาจส่งผลให้การใช้พื้นที่มีประสิทธิภาพมากขึ้น
77 c 

12
ประโยชน์ของการเขียนโปรแกรมเชิงวัตถุบนการเขียนโปรแกรมตามขั้นตอนคืออะไร
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างภาษาเชิงปฏิบัติเช่น C และภาษาเชิงวัตถุเช่น C ++ ฉันไม่เคยใช้ C ++ แต่ฉันได้คุยกับเพื่อน ๆ เกี่ยวกับวิธีแยกแยะทั้งสอง ฉันได้รับการบอกว่า C ++ มีแนวคิดเชิงวัตถุเช่นเดียวกับโหมดสาธารณะและส่วนตัวสำหรับการกำหนดตัวแปร: สิ่งที่ C ไม่มี ฉันไม่เคยใช้สิ่งเหล่านี้ในขณะที่กำลังพัฒนาโปรแกรมใน Visual Basic.NET: ประโยชน์ของสิ่งเหล่านี้คืออะไร? ฉันได้รับแจ้งด้วยว่าหากตัวแปรเป็นแบบสาธารณะมันสามารถเข้าถึงได้ทุกที่ แต่ไม่ชัดเจนว่ามันแตกต่างจากตัวแปรทั่วโลกในภาษาเช่น C หรือไม่และยังไม่ชัดเจนว่าตัวแปรส่วนตัวแตกต่างจากตัวแปรท้องถิ่นอย่างไร อีกสิ่งหนึ่งที่ฉันได้ยินคือเพื่อเหตุผลด้านความปลอดภัยหากจำเป็นต้องเข้าถึงฟังก์ชั่นควรได้รับการสืบทอดก่อน กรณีใช้งานคือผู้ดูแลระบบควรมีสิทธิ์มากเท่าที่ต้องการและไม่ใช่ทุกอย่าง แต่ดูเหมือนว่าเงื่อนไขจะทำงานได้ดี: if ( login == "admin") { // invoke the function } ทำไมสิ่งนี้จึงไม่เหมาะ เนื่องจากดูเหมือนว่าจะมีวิธีการในการทำทุกอย่างที่เกี่ยวกับวัตถุทำไมฉันจึงควรใส่ใจเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ

14
ผู้ประกาศชนิดข้อมูลเช่น "int" และ "char" ถูกเก็บไว้ใน RAM เมื่อโปรแกรม C ทำงานหรือไม่
เมื่อโปรแกรม C กำลังทำงานข้อมูลจะถูกเก็บไว้ในกองหรือกอง ค่าจะถูกเก็บไว้ในที่อยู่ RAM แต่สิ่งที่เกี่ยวกับตัวบ่งชี้ประเภท (เช่นintหรือchar) พวกเขายังเก็บไว้หรือไม่ พิจารณารหัสต่อไปนี้: char a = 'A'; int x = 4; ฉันอ่านว่า A และ 4 ถูกเก็บไว้ในที่อยู่ RAM ที่นี่ แต่สิ่งที่เกี่ยวaและx? ส่วนใหญ่สับสนวิธีการที่ไม่ดำเนินการที่รู้ว่าaเป็นถ่านและxเป็น int? ฉันหมายถึงเป็นintและcharพูดถึงบางแห่งใน RAM? สมมติว่าค่าถูกเก็บไว้ที่ใดที่หนึ่งใน RAM เช่น 10011001 ถ้าฉันเป็นโปรแกรมที่รันโค้ดฉันจะรู้ได้อย่างไรว่า 10011001 นี้เป็นcharหรือintไม่? สิ่งที่ผมไม่เข้าใจคือวิธีการใช้คอมพิวเตอร์รู้เมื่อมันอ่านค่าของตัวแปรจากที่อยู่เช่น 10001 ไม่ว่าจะเป็นหรือint ลองนึกภาพผมคลิกที่โปรแกรมที่เรียกว่าchar anyprog.exeรหัสทันทีเริ่มดำเนินการ ไฟล์ที่ปฏิบัติการได้นี้รวมถึงข้อมูลว่าตัวแปรที่เก็บไว้เป็นประเภทintหรือcharไม่?
74 c  data 

5
ทำไมมีคอมไพเลอร์ C น้อยมาก?
C เป็นหนึ่งในภาษาที่ใช้กันอย่างแพร่หลายมากที่สุดในโลก มันคิดเป็นสัดส่วนใหญ่ของรหัสที่มีอยู่และยังคงใช้สำหรับรหัสใหม่จำนวนมหาศาล เป็นที่ชื่นชอบของผู้ใช้มันบอกอย่างกว้างขวางว่าความสามารถในการเรียกใช้ C คือคำจำกัดความที่ไม่เป็นทางการของแพลตฟอร์มและได้รับคำชมจากแฟน ๆ ว่าเป็นภาษา "เล็ก" ที่มีคุณสมบัติค่อนข้างสะอาด แล้วคอมไพเลอร์ทั้งหมดอยู่ที่ไหน? บนเดสก์ท็อปมีสอง (แนบเนียน) สอง : GCC และเสียงดังกราว ลองคิดดูสักสองสามวินาทีคุณอาจจำได้ว่า Intel มีอยู่เช่นกัน มีคนอื่นไม่กี่คนที่คลุมเครือเกินกว่าที่คนทั่วไปจะตั้งชื่อและแทบจะไม่รบกวนการสนับสนุนภาษารุ่นล่าสุด (หรือบ่อยครั้งที่แม้แต่กลุ่มย่อยภาษาที่กำหนดไว้อย่างชัดเจนเพียงแค่ "ชุดย่อย") ครึ่งหนึ่งของสมาชิกในรายการนี้เป็นเชิงอรรถเชิงประวัติศาสตร์ ที่เหลือส่วนใหญ่มีความเชี่ยวชาญเป็นพิเศษและยังไม่ได้ใช้ภาษาเต็มรูปแบบ ที่จริงมีน้อยมากที่ดูเหมือนจะเป็นโอเพ่นซอร์ส Scheme และ Forth - ภาษาขนาดเล็กอื่น ๆ ที่แฟน ๆ ชื่นชอบ - อาจมีคอมไพเลอร์มากกว่าผู้ใช้จริง แม้บางอย่างเช่นSMLมี "ร้ายแรง" การใช้งานให้เลือกระหว่างกว่าองศาเซลเซียสในขณะที่การประกาศของคอมไพเลอร์ใหม่ (ยังไม่เสร็จ) C เล็งไปที่การตรวจสอบจริงเห็นตอบสนองเชิงลบบางสวยและการใช้งานที่มีประสบการณ์ต่อสู้เพื่อให้ได้ร่วมสมทบมากพอที่จะได้จับได้ถึง C99 ทำไม? การติดตั้ง C ยากไหม ไม่ใช่ C …

5
สิ่งที่ควรและสิ่งที่ไม่ควรอยู่ในไฟล์ส่วนหัว? [ปิด]
สิ่งที่ไม่ควรรวมอยู่ในไฟล์ส่วนหัวอย่างแน่นอน? ตัวอย่างเช่นถ้าฉันทำงานกับรูปแบบมาตรฐานอุตสาหกรรมที่มีค่าคงที่จำนวนมากเป็นวิธีปฏิบัติที่ดีที่จะกำหนดไว้ในไฟล์ส่วนหัว (ถ้าฉันเขียนโปรแกรมแยกวิเคราะห์สำหรับรูปแบบนั้น) ฟังก์ชั่นใดที่ควรเข้าไปในไฟล์ส่วนหัว? ฟังก์ชั่นอะไรไม่ควร?
71 c  headers 

19
เหตุใดฉันจึงต้องใส่ใจเกี่ยวกับประสิทธิภาพของไมโครและประสิทธิภาพ?
คำถามและคำตอบมากมายในหน้า C / C ++ โดยเฉพาะหรือหารือเกี่ยวกับปัญหาประสิทธิภาพการทำงานของไมโคร (เช่นค่าใช้จ่ายของฟังก์ชั่น vs vs direct vs inline ทางอ้อม) หรือการใช้อัลกอริทึมO (N 2 ) vs O (N log N) รายการ 100 รายการ ฉันมักจะเขียนโค้ดโดยไม่ต้องกังวลเกี่ยวกับประสิทธิภาพของไมโครและความกังวลเล็กน้อยเกี่ยวกับประสิทธิภาพของมาโครโดยมุ่งเน้นที่การบำรุงรักษาที่ง่ายและเชื่อถือได้นอกจากว่าฉันรู้ว่าฉันมีปัญหา คำถามของฉันคือเหตุใดโปรแกรมเมอร์จำนวนมากจึงสนใจ? มันเป็นปัญหาสำหรับนักพัฒนาส่วนใหญ่จริง ๆ หรือไม่ฉันเพิ่งโชคดีพอที่จะไม่ต้องกังวลกับมันมากเกินไปหรือฉันเป็นโปรแกรมเมอร์ที่ไม่ดี?

10
เหตุใด C ถึงมีชัยเหนือปาสกาล [ปิด]
ความเข้าใจของฉันคือว่าในปี 1980 และบางทีในปี 1990 เช่นกันปาสคาลและ C ก็ค่อนข้างหัวต่อหัวเป็นภาษาที่ผลิต การตายครั้งสุดท้ายของปาสกาลเป็นเพียงเพราะการเพิกเฉยของบอร์แลนด์เรื่องเดลฟายหรือไม่? หรือมีมากขึ้นเช่นโชคไม่ดีหรืออาจมีบางอย่างผิดปกติกับ Pascal (มีความหวังในการฟื้นฟูหรือไม่) ฉันสนใจในข้อเท็จจริงทางประวัติศาสตร์และการสังเกตการณ์อย่างใดอย่างหนึ่งสามารถสำรองข้อมูลมากกว่าชอบและไม่ชอบ

10
ทำไมภาษาต้องใช้วงเล็บในการแสดงออกเมื่อใช้กับ“ ถ้า” และ“ ในขณะที่”
ภาษาเช่น C, Java และ C ++ ทั้งหมดต้องวงเล็บรอบการแสดงออกทั้งเมื่อนำมาใช้ในการให้if, หรือwhileswitch if (true) { // Do something } ตรงข้ามกับ if true { // Do something } นี่ดูแปลกสำหรับฉันเพราะวงเล็บซ้ำซ้อน ในตัวอย่างtrueนี้เป็นการแสดงออกเพียงอย่างเดียวของมันเอง วงเล็บไม่เปลี่ยนความหมายในทางใดทางหนึ่งที่ฉันรู้ ทำไมไวยากรณ์แปลก ๆ นี้จึงมีอยู่และทำไมมันจึงเป็นเรื่องธรรมดา? มีประโยชน์ไหมที่ฉันไม่ทราบ?

11
ฉันจะโน้มน้าวหัวหน้าของฉันได้อย่างไรว่า ANSI C ไม่เพียงพอสำหรับโครงการใหม่ของเรา [ปิด]
ไม่กี่เดือนที่ผ่านมาเราเริ่มพัฒนาแอพเพื่อควบคุมอุปกรณ์ทดสอบที่พัฒนาขึ้นภายใน บริษัท และบันทึกชุดการวัด ควรมี UI อย่างง่ายและอาจต้องใช้เธรดเนื่องจากการบันทึกอย่างต่อเนื่องที่ต้องดำเนินการ แอปพลิเคชั่นนี้จะถูกใช้เป็นเวลาสองสามปีและจะได้รับการดูแลโดยนักศึกษาวิทยาศาสตร์คอมพิวเตอร์จำนวนหนึ่งในช่วงเวลานี้ เจ้านายของเราจบการศึกษาเมื่อ 30 ปีที่แล้ว (เพื่อไม่ให้ทำผิดฉันมีเวลามากกว่าครึ่งบนหลังของฉันด้วย) และได้รับคำสั่งให้เราพัฒนาแอปพลิเคชั่นนี้ใน ANSI C เหตุผลก็คือเขาเป็นคนเดียวที่ จะอยู่ตลอดเวลาและดังนั้นเขาจะต้องสามารถเข้าใจสิ่งที่เรากำลังทำอยู่ เขาตัดสินว่าเราไม่ควรใช้ประเภทข้อมูลนามธรรม เขายังให้รายชื่อเราด้วยชื่อตัวแปรทั่วโลก (ถอนหายใจ) ที่เขาต้องการให้เราใช้ ฉันลองใช้วิธีนั้นซักพัก แต่ก็ทำให้ฉันช้าลงเพื่อให้แน่ใจว่าการทำงานของตัวชี้ทั้งหมดนั้นปลอดภัยและสตริงทั้งหมดมีขนาดที่ถูกต้อง นอกจากนี้จำนวนบรรทัดของรหัสที่เกี่ยวข้องกับปัญหาที่เกิดขึ้นจริงเป็นเพียงส่วนเล็ก ๆ ของฐานรหัสของเรา หลังจากไม่กี่วันฉันก็ทิ้งทั้งสิ่งและเริ่มต้นใหม่โดยใช้ C # หัวหน้าของเราได้เห็นโปรแกรมกำลังทำงานอยู่และเขาชอบวิธีการทำงาน แต่เขาไม่รู้ว่ามันเขียนในภาษาอื่น สัปดาห์หน้าเราสองคนจะประชุมกันเพื่อดูซอร์สโค้ดเพื่อให้เขา "จะรู้วิธีรักษามัน" ฉันกลัวและฉันอยากได้ยินจากพวกคุณว่าข้อโต้แย้งใดที่ฉันสามารถใช้เพื่อสนับสนุนการตัดสินใจของฉัน คุณขี้ขลาด

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