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

แท็กนี้มีไว้สำหรับคำถามเกี่ยวกับมาตรฐานสากล ISO 9899: 1999 หรือที่เรียกว่า "C99" พร้อมข้อมูลทางเทคนิคและสำหรับคำถามเกี่ยวกับโค้ดที่เขียนใน C99 (ตรงข้ามกับ K&R C, C89 หรือใหม่กว่าการแก้ไขมาตรฐาน C เช่น C11 ฉบับปรับปรุงปี 2011) .


2
ใช้งานจริงของคำหลัก 'จำกัด ' C99?
ฉันกำลังอ่านเอกสารและคำถาม / คำตอบและเห็นมันกล่าวถึง ฉันอ่านคำอธิบายสั้น ๆ โดยระบุว่าโดยทั่วไปแล้วมันจะเป็นสัญญาจากโปรแกรมเมอร์ว่าจะไม่ใช้ตัวชี้ชี้ไปที่อื่น มีใครบ้างที่สามารถเสนอกรณีที่เป็นจริงได้ซึ่งคุ้มค่ากับการใช้งานจริงหรือไม่?
183 c  gcc  c99  restrict-qualifier 

10
ทางเลือกมาตรฐานของเคล็ดลับ ## __ VA_ARGS__ ของ GCC?
มีปัญหาที่รู้จักกันดี กับ args ที่ว่างเปล่าสำหรับแมโคร variadic ใน C99 ตัวอย่าง: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); การใช้งานBAR()ด้านบนนั้นไม่ถูกต้องตามมาตรฐาน C99 เนื่องจากจะขยายเป็น: printf("this breaks!",); สังเกตเครื่องหมายจุลภาคต่อท้าย - ใช้งานไม่ได้ คอมไพเลอร์บางตัว (เช่น: Visual Studio 2010) จะกำจัดเครื่องหมายจุลภาคที่ต่อท้ายให้คุณอย่างเงียบ ๆ คอมไพเลอร์อื่น ๆ (เช่น: GCC) รองรับการวางไว้##ด้านหน้า__VA_ARGS__เช่น: #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) แต่มีวิธีที่เป็นไปตามมาตรฐานในการรับพฤติกรรมนี้หรือไม่? บางทีใช้มาโครหลายตัว? ตอนนี้##รุ่นดูเหมือนจะได้รับการสนับสนุนอย่างดี (อย่างน้อยบนแพลตฟอร์มของฉัน) …

5
ไม่เข้าใจวิธีคำนวณกำลังสองของตัวเลขนี้
ฉันพบฟังก์ชันที่คำนวณกำลังสองของตัวเลข: int p(int n) { int a[n]; //works on C99 and above return (&a)[n] - a; } ก็จะส่งกลับค่า n 2 คำถามคือมันทำได้อย่างไร? หลังจากการทดสอบเล็ก ๆ น้อย ๆ ผมพบว่าระหว่าง(&a)[k]และ(&a)[k+1]เป็น/sizeof(a) sizeof(int)ทำไมถึงเป็นเช่นนั้น?

4
การแปลงบูลเป็น int
การแปลงนี้เป็นแบบพกพาเพียงใด มั่นใจได้หรือไม่ว่าการยืนยันทั้งสองผ่าน int x = 4<5; assert(x==1); x = 4>5; assert(x==0); อย่าถามว่าทำไม ฉันรู้ว่ามันน่าเกลียด ขอบคุณ.
131 c++  c  c99 

3
เอาต์พุตโปรแกรมด้านล่าง 'C89' เมื่อรวบรวมในโหมด C89 และ `C99` เมื่อรวบรวมในโหมด C99 อย่างไร
ฉันพบโปรแกรม C นี้จากเว็บ: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } สิ่งที่น่าสนใจของโปรแกรมนี้คือเมื่อคอมไพล์และรันในโหมด C89 มันจะพิมพ์C89และเมื่อคอมไพล์และรันในโหมด C99 มันจะพิมพ์C99ออกมา แต่ฉันไม่สามารถคิดออกว่าโปรแกรมนี้ทำงานอย่างไร คุณช่วยอธิบายว่าอาร์กิวเมนต์ที่สองของprintfงานในโปรแกรมข้างต้นได้อย่างไร
128 c  printf  comments  c99  c89 

5
C, C99, ANSI C และ GNU C ต่างกันอย่างไร?
ฉันได้เริ่มฝึกเขียนโปรแกรมบนcodechefและสับสนกับความแตกต่างระหว่าง C และ C99 C หมายถึงอะไรที่นี่? มันคือ C89? ตรวจสอบภาษาที่ด้านล่างของการส่งนี้ มีทั้ง C และ C99 ฉันพบสิ่งที่เรียกว่า GNU C บนอินเทอร์เน็ตมี C สำหรับระบบ linux / unix ต่างกันหรือไม่ สิ่งเหล่านี้เป็นไปตามมาตรฐาน C โดย ANSI หรือไม่ ฉันได้อ่านในบางสถานที่ "C99 เข้มงวด" นี่คืออะไร? มีมาตรฐานอื่น ๆ ของ C ที่ใช้งานอยู่หรือไม่? มีสิ่งที่เรียกว่า C 4.3.2 หรือเป็นเวอร์ชัน gcc ที่ใช้อยู่ในปัจจุบัน? แก้ไข: นี้ , นี้ , นี้ช่วย ฉันจะค้นหาเพิ่มเติมและแก้ไขสิ่งที่ยังไม่มีคำตอบ …
124 c  gcc  c99  c89  ansi-c 

5
เหตุใด C ++ 11 จึงไม่รองรับรายการ initializer ที่กำหนดเป็น C99 [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ พิจารณา: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } รหัสด้านบนถูกต้องตามกฎหมายใน C99 แต่ไม่ถูกกฎหมายใน C ++ 11 สิ่งที่เป็น C ++ 11 เหตุผลของคณะกรรมการมาตรฐานในการยกเว้นการสนับสนุนคุณลักษณะที่มีประโยชน์เช่นนี้หรือไม่?
121 c++  c  c++11  initialization  c99 

4
dot (.) หมายถึงอะไรในตัวเริ่มต้นโครงสร้าง
static struct fuse_oprations hello_oper = { .getattr = hello_getattr, .readdir = hello_readdir, .open = hello_open, .read = hello_read, }; ฉันไม่เข้าใจไวยากรณ์ C นี้ดี ฉันค้นหาไม่ได้ด้วยซ้ำเพราะฉันไม่รู้ชื่อไวยากรณ์ นั่นอะไร?

7
C99 stdint.h header และ MS Visual Studio
ด้วยความประหลาดใจของฉันฉันเพิ่งค้นพบว่า C99 stdint.h หายไปจาก MS Visual Studio 2003 ขึ้นไป ฉันแน่ใจว่าพวกเขามีเหตุผล แต่มีใครรู้บ้างว่าฉันสามารถดาวน์โหลดสำเนาได้ที่ไหน? หากไม่มีส่วนหัวนี้ฉันไม่มีคำจำกัดความสำหรับประเภทที่มีประโยชน์เช่น uint32_t เป็นต้น
113 c++  c  visual-studio  c99 

8
ตัวระบุความกว้าง Printf เพื่อรักษาความแม่นยำของค่าทศนิยม
มีตัวprintfระบุความกว้างที่สามารถนำไปใช้กับตัวระบุจุดลอยตัวที่จะจัดรูปแบบผลลัพธ์โดยอัตโนมัติเป็นจำนวนหลักสำคัญที่จำเป็นเช่นนั้นเมื่อสแกนสตริงกลับเข้าไปจะได้รับค่าทศนิยมเดิมหรือไม่ ตัวอย่างเช่นสมมติว่าฉันพิมพ์ a floatด้วยความแม่นยำของ2ตำแหน่งทศนิยม: float foobar = 0.9375; printf("%.2f", foobar); // prints out 0.94 เมื่อฉันสแกนผลลัพธ์0.94ฉันไม่มีการรับประกันที่เป็นไปตามมาตรฐานว่าฉันจะได้ค่า0.9375ทศนิยมดั้งเดิมกลับคืนมา (ในตัวอย่างนี้ฉันอาจจะไม่) ฉันต้องการวิธีบอกprintfให้พิมพ์ค่าทศนิยมไปยังจำนวนหลักที่จำเป็นโดยอัตโนมัติเพื่อให้แน่ใจว่าสามารถสแกนกลับไปเป็นค่าเดิมที่ส่งไปให้printfได้ ฉันสามารถใช้มาโครบางตัวfloat.hเพื่อหาค่าความกว้างสูงสุดที่จะส่งผ่านไปprintfได้ แต่มีตัวระบุให้พิมพ์โดยอัตโนมัติตามจำนวนหลักที่มีนัยสำคัญหรือไม่หรืออย่างน้อยก็เป็นความกว้างสูงสุด

12
Visual Studio รองรับมาตรฐาน C / C ++ ใหม่หรือไม่
ฉันอ่านเกี่ยวกับ C99 และ C ++ 11 มาเรื่อย ๆ และสิ่งที่น่ารักเหล่านี้ทั้งหมดที่เพิ่มเข้ามาในมาตรฐานภาษาที่อาจจะดีในการใช้สักวันหนึ่ง อย่างไรก็ตามขณะนี้เราไม่ได้อยู่ในดินแดนแห่งการเขียน C ++ ใน Visual Studio จะมีการเพิ่มสิ่งใหม่ ๆ ในมาตรฐานลงใน Visual Studio หรือไม่หรือ Microsoft สนใจที่จะเพิ่มตัวแปร C # ใหม่เพื่อทำสิ่งนั้น แก้ไข: นอกจากคำตอบที่ยอมรับแล้วฉันยังพบบล็อกของทีม Visual C ++: http://blogs.msdn.com/vcblog/ และโดยเฉพาะโพสต์นี้อยู่ในนั้น: https://web.archive.org/web/20190109064523/https://blogs.msdn.microsoft.com/vcblog/2008/02/22/tr1-slide-decks/ มีประโยชน์มาก. ขอบคุณ!

3
"อินไลน์" ที่ไม่มี "คงที่" หรือ "ภายนอก" จะมีประโยชน์ใน C99 หรือไม่?
เมื่อฉันพยายามสร้างรหัสนี้ inline void f() {} int main() { f(); } โดยใช้บรรทัดคำสั่ง gcc -std=c99 -o a a.c ฉันได้รับข้อผิดพลาดตัวเชื่อมโยง (ไม่ได้กำหนดอ้างอิงถึงf) ข้อผิดพลาดจะหายไปหากฉันใช้static inlineหรือextern inlineแทนที่จะเป็นเพียงแค่inlineหรือถ้าฉันคอมไพล์ด้วย-O(ดังนั้นฟังก์ชันจะถูกแทรกในบรรทัด) พฤติกรรมนี้ดูเหมือนจะกำหนดไว้ในย่อหน้า 6.7.4 (6) ของมาตรฐาน C99: หากการประกาศขอบเขตไฟล์ทั้งหมดสำหรับฟังก์ชันในหน่วยการแปลมีตัวinlineระบุฟังก์ชันที่ไม่มีexternคำจำกัดความในหน่วยการแปลนั้นจะเป็นนิยามแบบอินไลน์ คำจำกัดความแบบอินไลน์ไม่ได้ให้คำจำกัดความภายนอกสำหรับฟังก์ชันและไม่ห้ามการกำหนดภายนอกในหน่วยการแปลอื่น นิยามแบบอินไลน์เป็นทางเลือกให้กับนิยามภายนอกซึ่งนักแปลอาจใช้เพื่อเรียกใช้ฟังก์ชันใด ๆ ในหน่วยการแปลเดียวกัน ไม่ได้ระบุว่าการเรียกใช้ฟังก์ชันใช้นิยามอินไลน์หรือนิยามภายนอก ถ้าฉันเข้าใจทั้งหมดนี้อย่างถูกต้องหน่วยคอมไพล์ที่มีฟังก์ชันที่กำหนดไว้inlineในตัวอย่างด้านบนจะคอมไพล์อย่างสม่ำเสมอก็ต่อเมื่อมีฟังก์ชันภายนอกที่มีชื่อเดียวกันและฉันไม่เคยรู้ว่าฟังก์ชันของตัวเองหรือฟังก์ชันภายนอกถูกเรียกใช้ พฤติกรรมนี้ไม่โง่อย่างสมบูรณ์หรือไม่? การกำหนดฟังก์ชันinlineโดยไม่มีstaticหรือexternใน C99 มีประโยชน์หรือไม่? ฉันพลาดอะไรไปรึเปล่า? สรุปคำตอบ แน่นอนว่าฉันพลาดอะไรบางอย่างไปและพฤติกรรมก็ไม่ได้บ้าคลั่ง :) ตามที่Nemo อธิบายแนวคิดคือการกำหนดนิยามของฟังก์ชัน inline void f() {} ในไฟล์ส่วนหัวและมีเพียงการประกาศเท่านั้น extern inline …
97 c  inline  c99 

3
มีเครื่องจักรที่ sizeof (ถ่าน)! = 1 หรืออย่างน้อย CHAR_BIT> 8 หรือไม่
Наэтотвопросестьответына Stack Overflow нарусском : Кто-нибудьвстречалвсвоейпрактике sizeof (ถ่าน)! = 1? มีเครื่องจักร (หรือคอมไพเลอร์) อยู่ที่ไหนsizeof(char) != 1? ไม่มาตรฐาน C99กล่าวว่าsizeof(char)ในการดำเนินการปฏิบัติตามมาตรฐานต้องเป็น 1? ถ้าเป็นเช่นนั้นโปรดให้หมายเลขมาตราและการอ้างอิง อัปเดต: หากฉันมีเครื่อง (CPU) ซึ่งไม่สามารถระบุไบต์ได้ (อ่านน้อยที่สุดคือ 4 ไบต์จัดแนว) แต่มีไบต์เพียง 4 วินาที ( uint32_t) คอมไพเลอร์สำหรับเครื่องนี้สามารถกำหนดsizeof(char)เป็น 4 ได้หรือไม่ sizeof(char)จะเป็น 1 แต่ถ่านจะมี 32 บิต ( CHAR_BITมาโคร) Update2: แต่ขนาดของผลลัพธ์ไม่ใช่ไบต์! มีขนาดเท่ากับ CHAR และถ่านสามารถเป็น 2 ไบต์หรือ (อาจเป็น) 7 …
93 c  char  standards  sizeof  c99 

3
การพิมพ์พอยน์เตอร์ว่างด้วย% p เป็นพฤติกรรมที่ไม่ได้กำหนด?
เป็นพฤติกรรมที่ไม่ได้กำหนดไว้ในการพิมพ์พอยน์เตอร์ว่างด้วยตัว%pระบุการแปลงหรือไม่ #include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } คำถามนี้ใช้กับมาตรฐาน C ไม่ใช่กับการใช้งาน C

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