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

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

5
ทำไมโครงสร้างขนาด 3 แทนที่จะเป็น 2
ฉันได้กำหนดโครงสร้างนี้: typedef struct { char A:3; char B:3; char C:3; char D:3; char E:3; } col; sizeof(col)ให้ฉันเอาท์พุทของ 3 แต่ไม่ควรจะเป็น 2 หรือไม่? ถ้าฉันแสดงความคิดเห็นเพียงองค์ประกอบเดียวsizeofคือ 2 ฉันไม่เข้าใจว่าทำไม: ห้าองค์ประกอบของ 3 บิตเท่ากับ 15 บิตและน้อยกว่า 2 ไบต์ มี "ขนาดภายใน" ในการกำหนดโครงสร้างเช่นนี้หรือไม่? ฉันแค่ต้องการคำชี้แจงเพราะจากความคิดของฉันเกี่ยวกับภาษาจนถึงตอนนี้ฉันคาดว่าจะมีขนาด 2 ไบต์ไม่ใช่ 3
91 c++  c  struct 

1
ใช้ roxygen2 และ doxygen ในแพ็คเกจเดียวกันหรือไม่? [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบพร้อมข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันมีRแพ็คเกจที่ใช้roxygen2. มีCรหัสอยู่/srcและฉันเพิ่งเริ่มทำงานกับ Doxygen มีวิธีใดบ้างในการรวมเอกสารหรือรวมการคอมไพล์กับ roxygen2? "แนวทางปฏิบัติที่ดีที่สุด" สำหรับวางCเอกสารโค้ดไว้ที่ใด Googling สำหรับ roxygen2 และ doxygen ส่วนใหญ่นำไปสู่roxygen คล้ายกับผลลัพธ์ของdoxygen ฉันพบสองสามแพ็คเกจกับ Doxyfiles แต่ไม่มีองค์กรที่สอดคล้องกัน ตัวอย่างเช่น lme4 มีinst/doc/Doxyfileเอาต์พุตไปยังโฟลเดอร์ที่เรียกว่าdoxygenภายนอกlme4ไดเร็กทอรีต้นทาง นอกจากนี้ยังมี Doxyfile ในไดเร็กทอรีรากของ Matrix (แต่ในรีลีสก่อนหน้านี้อยู่ในinstเอกสารนี้จะถูกส่งออกนอกไดเร็กทอรีแพ็กเกจด้วย มีเหตุผลที่จะไม่รวมถึงการใด ๆCเอกสารภายในแพคเกจหรือทำไม Doxygen ใช้เพื่อบ่อยภายในแพคเกจ R แม้จะมีการใช้อย่างแพร่หลายของC? อัปเดต:ดูคำขอคุณลักษณะ roxygen2ที่เกี่ยวข้อง

12
การประกาศตัวแปรในไฟล์ส่วนหัว - คงที่หรือไม่?
เมื่อปรับโครงสร้างใหม่บางส่วน#definesฉันเจอการประกาศที่คล้ายกับสิ่งต่อไปนี้ในไฟล์ส่วนหัว C ++: static const unsigned int VAL = 42; const unsigned int ANOTHER_VAL = 37; คำถามคือสถิตจะสร้างความแตกต่างอะไรได้บ้าง? โปรดทราบว่าการรวมส่วนหัวหลายรายการไม่สามารถทำได้เนื่องจาก#ifndef HEADER #define HEADER #endifเคล็ดลับแบบคลาสสิก(หากมีความสำคัญ) สแตติกหมายถึงการVALสร้างสำเนาเพียงชุดเดียวในกรณีที่ส่วนหัวรวมอยู่ในไฟล์ต้นฉบับมากกว่าหนึ่งไฟล์หรือไม่
91 c++  c  static 


10
เปิดไลบรารี PDF สำหรับแอปพลิเคชัน C / C ++? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันต้องการสร้างเอาต์พุต PDF จากแอปพลิเคชัน C ++ Windows (เนทีฟ) ของฉัน มีไลบรารีฟรี / โอเพ่นซอร์สให้ทำสิ่งนี้หรือไม่? ฉันดูคำตอบของคำถามนี้แต่ส่วนใหญ่เกี่ยวข้องกับ. Net
91 c++  c  pdf  open-source 


3
เชื่อมต่อ int กับสตริงโดยใช้ C Preprocessor
ฉันกำลังพยายามหาวิธีเชื่อมสตริง#define'd int กับ a #define' d โดยใช้C Preprocessor คอมไพเลอร์ของฉันคือ GCC 4.1 บน CentOS 5 โซลูชันนี้ควรใช้ได้กับ MinGW ด้วย ฉันต้องการต่อท้ายหมายเลขเวอร์ชันลงในสตริง แต่วิธีเดียวที่ฉันจะทำให้มันใช้งานได้คือการทำสำเนาหมายเลขเวอร์ชันที่กำหนดเป็นสตริง สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือวิธีการอ้างอาร์กิวเมนต์มาโคร แต่ใช้ไม่ได้กับ#defines สิ่งนี้ไม่ได้ผล #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER มันไม่ทำงานโดยไม่ต้อง#s ทั้งเพราะค่าจะเป็นตัวเลขและมันจะขยายตัวออกไป"/home/user/.myapp" 2 6ซึ่งไม่ถูกต้องC วิธีนี้ใช้งานได้ แต่ฉันไม่ชอบให้สำเนาของเวอร์ชันกำหนดเพราะฉันต้องการให้เป็นตัวเลขเช่นกัน #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR …

4
GDB: แบ่งถ้าตัวแปรเท่ากับค่า
ฉันต้องการให้ GDB กำหนดจุดพักเมื่อตัวแปรเท่ากับค่าที่ฉันตั้งไว้ฉันลองใช้ตัวอย่างนี้: #include <stdio.h> main() { int i = 0; for(i=0;i<7;++i) printf("%d\n", i); return 0; } ผลลัพธ์จาก GDB: (gdb) break if ((int)i == 5) No default breakpoint address now. (gdb) run Starting program: /home/SIFE/run 0 1 2 3 4 5 6 Program exited normally. (gdb) อย่างที่คุณเห็น GDB ไม่ได้สร้างจุดแตกหักเป็นไปได้ด้วย GDB …
91 c  gdb 

9
วิธีใช้ nan และ inf ใน C?
ฉันมีวิธีการเชิงตัวเลขที่สามารถคืนค่า nan หรือ inf ได้หากมีข้อผิดพลาดและสำหรับการทดสอบฉันต้องการบังคับให้ส่งคืน nan หรือ inf ชั่วคราวเพื่อให้แน่ใจว่าสถานการณ์ได้รับการจัดการอย่างถูกต้อง มีวิธีที่เชื่อถือได้และไม่ขึ้นกับคอมไพเลอร์ในการสร้างค่าของ nan และ inf ใน C หรือไม่? หลังจาก googling ประมาณ 10 นาทีฉันสามารถค้นหาโซลูชันที่ขึ้นกับคอมไพเลอร์ได้เท่านั้น
91 c  math 

4
จะแสดงรายการไฟล์ในไดเร็กทอรีในโปรแกรม C ได้อย่างไร?
ฉันพยายามเขียนเซิร์ฟเวอร์ ftp บน Linux ในเรื่องนี้ฉันจะแสดงรายการไฟล์ในไดเร็กทอรีบนเทอร์มินัลโดยโปรแกรม C ได้อย่างไร? บางทีฉันอาจใช้ฟังก์ชัน exec เพื่อเรียกใช้คำสั่ง find แต่ฉันต้องการชื่อไฟล์เป็นสตริงเพื่อส่งโปรแกรมไคลเอนต์ ฉันจะทำเช่นนี้ได้อย่างไร? ขอบคุณสำหรับคำตอบ
91 c  linux 

7
ใช้ดำเนินการต่อในคำสั่งสวิตช์
ฉันต้องการข้ามจากตรงกลางของswitchคำสั่งไปยังคำสั่งวนซ้ำในรหัสต่อไปนี้: while (something = get_something()) { switch (something) { case A: case B: break; default: // get another something and try again continue; } // do something for a handled something do_something(); } วิธีนี้ใช้ได้continueหรือไม่ มีcontinueงบโดยไม่สนใจswitchงบ? C และ C ++ แตกต่างกันในพฤติกรรมของพวกเขาที่นี่หรือไม่?

8
เป็นไปได้หรือไม่ที่จะเริ่มต้นตัวชี้ C เป็น NULL
ฉันเคยเขียนสิ่งต่างๆเช่น char *x=NULL; บนสมมติฐานที่ว่า char *x=2; จะสร้างcharตัวชี้ไปยังที่อยู่ 2 แต่ในบทช่วยสอนการเขียนโปรแกรม GNU Cบอกว่าจะint *my_int_ptr = 2;เก็บค่าจำนวนเต็ม2ไว้ที่ที่อยู่แบบสุ่มใด ๆ ก็ตามmy_int_ptrเมื่อมีการจัดสรร สิ่งนี้ดูเหมือนจะบอกเป็นนัยว่าของฉันเองchar *x=NULLกำลังกำหนดค่าของการNULLร่ายให้กับ a charคือที่อยู่แบบสุ่มบางส่วนในหน่วยความจำ ในขณะที่ #include <stdlib.h> #include <stdio.h> int main() { char *x=NULL; if (x==NULL) printf("is NULL\n"); return EXIT_SUCCESS; } ในความเป็นจริงพิมพ์ เป็นโมฆะ เมื่อฉันรวบรวมและเรียกใช้ฉันกังวลว่าฉันกำลังอาศัยพฤติกรรมที่ไม่ได้กำหนดหรืออย่างน้อยพฤติกรรมที่ไม่ระบุและฉันควรเขียน char *x; x=NULL; แทน.

2
นี่คืออะไร (( ))?
ขณะเรียกดูซอร์สโค้ดคอมไพเลอร์ gcc (gcc / c-family / c-pragma.c) ฉันเห็น: typedef struct GTY(()) align_stack { int alignment; tree id; struct align_stack * prev; } align_stack; และไม่ว่าฉันจะมีการเขียนโปรแกรม C มาหลายปีก็ตามบิตเหล่านี้: (())ยังไม่เป็นที่รู้จักสำหรับฉันเลย ใครช่วยอธิบายความหมายได้บ้าง Google ดูเหมือนจะไม่พบ
90 c++  c 

13
ฟังก์ชันใดจากไลบรารีมาตรฐานที่ต้อง (ควร) หลีกเลี่ยง
ฉันได้อ่านใน Stack Overflow ว่าฟังก์ชัน C บางฟังก์ชัน "ล้าสมัย" หรือ "ควรหลีกเลี่ยง" คุณช่วยยกตัวอย่างฟังก์ชันประเภทนี้และเหตุผลให้ฉันได้ไหม มีทางเลือกใดบ้างสำหรับฟังก์ชันเหล่านั้น เราสามารถใช้ได้อย่างปลอดภัย - มีแนวทางปฏิบัติที่ดีหรือไม่?

1
อะไรทำให้ Java แยกวิเคราะห์ได้ง่ายกว่า C
ฉันคุ้นเคยกับข้อเท็จจริงที่ว่าไวยากรณ์ของ C และ C ++ มีความละเอียดอ่อนตามบริบทและโดยเฉพาะอย่างยิ่งคุณต้องมี "lexer hack" ใน C ในทางกลับกันฉันรู้สึกว่าคุณสามารถแยกวิเคราะห์ Java ได้เพียง 2 โทเค็นแห่งการมองไปข้างหน้าแม้จะมีความคล้ายคลึงกันมากระหว่างสองภาษา คุณต้องเปลี่ยนแปลงอะไรเกี่ยวกับ C เพื่อให้สามารถแยกวิเคราะห์ได้ง่ายขึ้น ฉันถามเพราะตัวอย่างทั้งหมดที่ฉันเคยเห็นเกี่ยวกับความไวต่อบริบทของ C นั้นสามารถทำได้ในทางเทคนิค แต่ก็แปลกมาก ตัวอย่างเช่น, foo (a); อาจจะมีการเรียกฟังก์ชันโมฆะกับข้อโต้แย้งfoo aหรืออาจเป็นการประกาศว่าaเป็นวัตถุประเภทหนึ่งfooแต่คุณสามารถกำจัด parantheses ได้อย่างง่ายดาย ส่วนหนึ่งความแปลกนี้เกิดขึ้นเนื่องจากกฎการผลิต "ผู้ประกาศโดยตรง" สำหรับไวยากรณ์ Cตอบสนองวัตถุประสงค์สองประการในการประกาศทั้งฟังก์ชันและตัวแปร ในทางกลับกันไวยากรณ์ Javaมีกฎการผลิตแยกต่างหากสำหรับการประกาศตัวแปรและการประกาศฟังก์ชัน ถ้าคุณเขียน foo a; คุณจะรู้ว่ามันเป็นการประกาศตัวแปรและfooสามารถแยกวิเคราะห์เป็นชื่อประเภทได้อย่างชัดเจน นี่อาจไม่ใช่รหัสที่ถูกต้องหากfooไม่ได้กำหนดคลาสไว้ที่ใดที่หนึ่งในขอบเขตปัจจุบัน แต่นั่นเป็นงานสำหรับการวิเคราะห์เชิงความหมายที่สามารถดำเนินการได้ในคอมไพเลอร์พาสในภายหลัง ฉันเคยเห็นมันบอกว่า C นั้นยากที่จะแยกวิเคราะห์เนื่องจาก typedef แต่คุณสามารถประกาศประเภทของคุณเองใน Java ได้เช่นกัน กฎไวยากรณ์ภาษา C …
90 java  c  parsing  grammar 

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