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

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

3
เหตุใดการแปลงจากค่าคงที่สตริงถึง 'char *' ใช้ได้ใน C แต่ไม่ถูกต้องใน C ++
มาตรฐาน C ++ 11 (ISO / IEC 14882: 2011) กล่าวใน§ C.1.1: char* p = "abc"; // valid in C, invalid in C++ สำหรับ C ++ มันก็โอเคในฐานะที่เป็นตัวชี้ไปที่ตัวอักษรของสตริงที่เป็นอันตรายเนื่องจากความพยายามใด ๆ ในการแก้ไขมันจะนำไปสู่ความผิดพลาด แต่ทำไมมันถึงใช้ได้ใน C? C ++ 11 ยังบอกด้วย: char* p = (char*)"abc"; // OK: cast added ซึ่งหมายความว่าหากมีการเพิ่มการร่ายลงในคำสั่งแรกมันจะใช้ได้ ทำไมการคัดเลือกนักแสดงทำให้คำสั่งที่สองใช้ได้ใน C ++ และมันแตกต่างจากคำสั่งแรกได้อย่างไร? มันยังคงเป็นอันตรายหรือไม่? ถ้าเป็นเช่นนั้นทำไมมาตรฐานถึงบอกว่าตกลง
163 c++  c  string  c++11  char 

1
สร้างไฟล์. so จากไฟล์. c โดยใช้บรรทัดคำสั่ง gcc
ฉันกำลังพยายามสร้างโปรเจค Hello world สำหรับลินุกซ์ไดนามิกไลบรารี (ไฟล์. so) ดังนั้นฉันมีไฟล์ hello.c: #include <stdio.h> void hello() { printf("Hello world!\n"); } ฉันจะสร้างไฟล์. so ที่ส่งออกhello()โดยใช้ gcc จากบรรทัดคำสั่งได้อย่างไร
162 c  linux  gcc  shared-libraries 

15
วิธีการหลีกเลี่ยงการล้นใน expr เอบีซีดี
ฉันต้องคำนวณนิพจน์ที่มีลักษณะดังนี้: A*B - C*D, ชนิดของพวกเขาคือ: signed long long int A, B, C, D; แต่ละหมายเลขสามารถมีขนาดใหญ่มาก (ไม่ล้นประเภท) ในขณะที่A*Bอาจทำให้เกิดการล้นในเวลาเดียวกันการแสดงออกA*B - C*Dอาจมีขนาดเล็กมาก ฉันจะคำนวณอย่างถูกต้องได้อย่างไร ตัวอย่างเช่น: MAX * MAX - (MAX - 1) * (MAX + 1) == 1, ที่ไหนMAX = LLONG_MAX - nและ n - จำนวนธรรมชาติบางอย่าง
161 c++  c  integer-overflow 

2
ทำไมตัวอักษรถึงแบ่งออกเป็นหลายช่วงในรหัส C นี้
ในห้องสมุดที่กำหนดเองฉันเห็นการใช้งาน: inline int is_upper_alpha(char chValue) { if (((chValue >= 'A') && (chValue <= 'I')) || ((chValue >= 'J') && (chValue <= 'R')) || ((chValue >= 'S') && (chValue <= 'Z'))) return 1; return 0; } นั่นคือไข่อีสเตอร์หรืออะไรคือข้อดีกับวิธี C / C ++ มาตรฐาน? inline int is_upper_alpha(char chValue) { return ((chValue >= 'A') …
161 c++  c  character  toupper 

8
สตริงตัวอักษร: พวกเขาจะไปที่ไหน
ฉันสนใจที่ตัวอักษรสตริงได้รับการจัดสรร / จัดเก็บ ฉันพบคำตอบที่น่าสนใจที่นี่โดยพูดว่า: การกำหนดสตริงแบบอินไลน์ฝังข้อมูลลงในโปรแกรมของตัวเองและไม่สามารถเปลี่ยนแปลงได้ (คอมไพเลอร์บางตัวยอมให้สิ่งนี้ทำได้โดยใช้เล่ห์เหลี่ยมไม่ต้องกังวล) แต่มันเกี่ยวข้องกับ C ++ ไม่ต้องพูดถึงว่ามันไม่รบกวน ฉันกำลังยุ่ง = D ดังนั้นคำถามของฉันอยู่ที่ไหนสตริงตัวอักษรของฉันจะถูกเก็บไว้อย่างไร? ทำไมฉันไม่ลองเปลี่ยนมันล่ะ? การใช้งานแตกต่างกันไปตามแพลตฟอร์มหรือไม่ ไม่มีใครสนใจที่จะอธิบายรายละเอียดเกี่ยวกับ "เคล็ดลับสมาร์ท?"

4
เหตุใดจึงต้องการเริ่มต้น + (สิ้นสุด - เริ่ม) / 2 เหนือ (เริ่ม + จบ) / 2 เมื่อคำนวณตรงกลางของอาร์เรย์?
ฉันเคยเห็นโปรแกรมเมอร์ใช้สูตร mid = start + (end - start) / 2 แทนที่จะใช้สูตรที่ง่ายกว่า mid = (start + end) / 2 สำหรับการค้นหาองค์ประกอบกลางในอาร์เรย์หรือรายการ ทำไมพวกเขาถึงใช้อดีต?
160 c  algorithm 


14
วิธีจับภาพหน้าจอที่เร็วที่สุดบน Windows
ฉันต้องการเขียนโปรแกรม screencasting สำหรับแพลตฟอร์ม Windows แต่ไม่แน่ใจว่าจะจับภาพหน้าจอได้อย่างไร วิธีเดียวที่ฉันรู้คือใช้ GDI แต่ฉันอยากรู้ว่ามีวิธีอื่นที่จะไปเกี่ยวกับเรื่องนี้หรือไม่และถ้ามีมีสิ่งใดที่เกิดขึ้นอย่างน้อยที่สุด? ความเร็วเป็นสิ่งสำคัญ โปรแกรม screencasting จะใช้สำหรับการบันทึกวิดีโอเกมแม้ว่ามันจะแคบลง แต่ตัวเลือกฉันยังคงเปิดรับข้อเสนอแนะอื่น ๆ ที่หลุดออกจากขอบเขตนี้ ความรู้ไม่เลวหลังจากทั้งหมด แก้ไข : ฉันมาข้ามบทความนี้: วิธีการต่างๆสำหรับการจับหน้าจอ มันแนะนำให้ฉันรู้จักกับวิธีการทำ Windows Media API และวิธี DirectX ในการทำมัน โดยกล่าวถึงในข้อสรุปว่าการปิดใช้งานการเร่งด้วยฮาร์ดแวร์สามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันการจับภาพได้อย่างมาก ฉันอยากรู้ว่าทำไมถึงเป็นแบบนี้ ใครช่วยเติมเต็มช่องว่างที่ขาดหายไปให้ฉันได้ไหม แก้ไข : ฉันอ่านโปรแกรม screencasting เช่น Camtasia ใช้ไดรเวอร์การจับภาพของตัวเอง มีคนให้คำอธิบายในเชิงลึกเกี่ยวกับวิธีการทำงานและทำไมมันเร็วกว่า ฉันอาจต้องการคำแนะนำในการดำเนินการบางอย่างเช่นนั้น แต่ฉันแน่ใจว่ามีเอกสารที่มีอยู่แล้ว นอกจากนี้ฉันรู้แล้วว่า FRAPS บันทึกหน้าจอได้อย่างไร มันขอ API กราฟิกพื้นฐานที่จะอ่านจากบัฟเฟอร์ด้านหลัง จากสิ่งที่ฉันเข้าใจนี่เป็นเร็วกว่าการอ่านจากบัฟเฟอร์ด้านหน้าเพราะคุณกำลังอ่านจาก RAM ระบบมากกว่าวิดีโอ RAM …
159 c++  c  windows 

13
“ หน่วยความจำที่จัดสรรในเวลารวบรวม” หมายความว่าอย่างไร?
ในการเขียนโปรแกรมภาษาเช่น C และ C ++ ผู้คนมักจะอ้างถึงการจัดสรรหน่วยความจำแบบคงที่และแบบไดนามิก ฉันเข้าใจแนวคิด แต่วลี "หน่วยความจำทั้งหมดถูกจัดสรร (สงวนไว้) ในช่วงเวลารวบรวม" ทำให้ฉันสับสนอยู่เสมอ การรวบรวมดังที่ฉันเข้าใจแล้วจะแปลงรหัส C / C ++ ระดับสูงเป็นภาษาเครื่องและส่งออกไฟล์ปฏิบัติการ หน่วยความจำ "จัดสรร" ในไฟล์ที่คอมไพล์แล้วเป็นอย่างไร? การจัดสรรหน่วยความจำใน RAM มักจะไม่ใช่เรื่องการจัดการหน่วยความจำเสมือนทุกครั้งหรือไม่ การจัดสรรหน่วยความจำตามคำนิยามไม่ใช่แนวคิดของรันไทม์ใช่หรือไม่ ถ้าฉันสร้างตัวแปรที่จัดสรรแบบคงที่ 1KB ในรหัส C / C ++ ของฉันนั่นจะเพิ่มขนาดของไฟล์ปฏิบัติการด้วยจำนวนเดียวกันหรือไม่? นี่เป็นหนึ่งในหน้าที่ใช้วลีภายใต้หัวข้อ "การจัดสรรแบบคงที่" กลับไปสู่พื้นฐาน: การจัดสรรหน่วยความจำประวัติความเป็นมา

14
ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Mojave
ฉันใช้คำสั่ง gcc บนเทอร์มินัลเพื่อรวบรวมโปรแกรม C แต่ในทันทีหลังจากการอัปเดตเป็นระบบปฏิบัติการ Mac ของฉัน (เป็น macOS 10.14 Mojave และ XCode 10.0) ฉันเริ่มได้รับข้อความ: test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. ฉันติดตั้ง gcc ไว้แล้วและหาได้ใน/usr/local/binนั้นมี gcc อยู่ในนั้นจริงๆ ฉันพยายามเรียกใช้ไฟล์เดียวกันบน iMac อื่นของฉันและทำงานได้โดยไม่มีปัญหา ฉันพยายามเรียกใช้xcode-select --installและติดตั้งแล้วดังนั้นจึงไม่สามารถแก้ไขปัญหาที่ฉันมีอยู่ในขณะนี้ ฉันคาดเดาว่าเส้นทางจะมีความยุ่งเหยิงเนื่องจากไม่สามารถหาได้gccหลังจากที่ฉันเริ่มคัดลอกและวางคำสั่งบางอย่างจากแหล่งข้อมูลอื่นเพื่อแก้ไขปัญหานี้ ต้องการความช่วยเหลือในเรื่องนี้
159 c  macos  gcc  terminal 

1
ทำไมหนังสือ“ The C Programming Language” ถึงบอกว่าฉันต้องโยน malloc?
วันนี้ผมมาถึงหน้า167ของภาษา C Programming (ฉบับที่สองไบรอัน W. Kernighan และเดนนิสเอ็ม Ritchie)mallocและพบว่าผู้เขียนบอกว่าผมต้องทิ้ง นี่คือส่วนหนึ่งจากหนังสือ: 7.8.5 การจัดการพื้นที่เก็บข้อมูล ฟังก์ชัน malloc และ calloc รับบล็อกของหน่วยความจำแบบไดนามิก void *malloc(size_t n) ส่งคืนตัวชี้ไปยัง n ไบต์ของที่เก็บข้อมูลที่ไม่กำหนดค่าเริ่มต้นหรือ NULL ถ้าไม่สามารถดำเนินการตามคำขอได้ void *calloc(size_t n, size_t size) ส่งกลับตัวชี้ไปยังพื้นที่ว่างเพียงพอสำหรับอาร์เรย์ของวัตถุ n ขนาดที่ระบุหรือ NULL ถ้าคำขอไม่สามารถตอบสนอง ที่เก็บข้อมูลถูกเตรียมใช้งานเป็นศูนย์ ตัวชี้ที่ส่งคืนโดย malloc หรือ calloc มีการจัดตำแหน่งที่เหมาะสมสำหรับวัตถุที่เป็นปัญหา แต่ต้องถูกส่งลงในประเภทที่เหมาะสมเช่นเดียวกับใน int *ip; ip = (int *) calloc(n, sizeof(int)); ผมรู้อยู่แล้วว่าmalloc(และครอบครัว) …

3
การประกาศฟังก์ชั่นไม่ใช่ต้นแบบ
ฉันมีห้องสมุดที่ฉันสร้าง mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); ในโปรแกรมของฉันฉันพยายามเรียกใช้ฟังก์ชันไลบรารีนี้: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } เมื่อฉันพยายามรวบรวมโปรแกรมนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: ในไฟล์รวมจาก myprogram.c: 1 mylib.h: คำเตือน 2: การประกาศฟังก์ชั่นไม่ใช่ต้นแบบ ฉันกำลังใช้: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) คำถามของฉันคือวิธีที่เหมาะสมในการประกาศต้นแบบฟังก์ชั่นคืออะไร?
158 c  gcc 


9
เหตุใดการไหลออกจากจุดสิ้นสุดของฟังก์ชันที่ไม่ใช่โมฆะโดยไม่ส่งคืนค่าไม่ทำให้เกิดข้อผิดพลาดของคอมไพเลอร์
นับตั้งแต่ฉันรู้มาหลายปีแล้วว่าสิ่งนี้ไม่ได้สร้างข้อผิดพลาดตามค่าเริ่มต้น (อย่างน้อยใน GCC) ฉันสงสัยอยู่เสมอว่าเพราะอะไร ฉันเข้าใจว่าคุณสามารถออกธงคอมไพเลอร์เพื่อสร้างคำเตือน แต่มันควรจะเป็นข้อผิดพลาดหรือไม่? ทำไมมันจึงสมเหตุสมผลสำหรับฟังก์ชั่นที่ไม่ใช่โมฆะไม่คืนค่าที่ถูกต้อง? ตัวอย่างตามที่ร้องขอในความคิดเห็น: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ... คอมไพล์
158 c++  c  gcc  g++ 

8
C runtime library คืออะไร?
จริง ๆ แล้ว C runtime library คืออะไรและใช้ทำอะไร? ฉันกำลังค้นหา Googling เหมือนปีศาจ แต่ฉันไม่สามารถหาอะไรที่ดีไปกว่าของ Microsoft: "ไลบรารีรันไทม์ของ Microsoft ให้รูทีนสำหรับการเขียนโปรแกรมสำหรับระบบปฏิบัติการ Microsoft Windows รูทีนเหล่านี้ทำให้งานการเขียนโปรแกรมทั่วไปที่ไม่ได้จัดเตรียมไว้โดยอัตโนมัติ ภาษา C และ C ++ " ตกลงฉันเข้าใจแล้ว แต่ยกตัวอย่างว่ามีlibcmt.libอะไรเกิดขึ้นบ้าง มันทำอะไร? ฉันคิดว่า C standard library เป็นส่วนหนึ่งของคอมไพเลอร์ C ดังนั้นจะlibcmt.libใช้งาน Windows ของฟังก์ชั่น C ห้องสมุดมาตรฐานในการทำงานภายใต้ win32?
158 c  runtime 

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