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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

12
แพลตฟอร์มใดมีสิ่งอื่นที่ไม่ใช่ถ่าน 8 บิต
ทุกขณะนี้แล้วคนอื่นที่ใช้จุดเพื่อออกว่าchar(aka 'ไบต์') ไม่จำเป็นต้องเป็น 8 บิต ดูเหมือนว่า 8 บิตcharนั้นเกือบจะเป็นสากล ฉันจะคิดว่าสำหรับแพลตฟอร์มหลักจำเป็นต้องมี 8 บิตcharเพื่อให้แน่ใจว่ามีศักยภาพในตลาด ทั้งในตอนนี้และในอดีตแพลตฟอร์มใดที่ใช้charไม่ได้เป็น 8 บิตและทำไมพวกเขาถึงแตกต่างจาก "ปกติ" 8 บิต เมื่อเขียนโค้ดและคิดถึงการสนับสนุนข้ามแพลตฟอร์ม (เช่นสำหรับไลบรารีที่ใช้งานทั่วไป) สิ่งที่ควรคำนึงถึงในการให้แพลตฟอร์มที่ไม่ใช่ non-8-bit charคืออะไร ในอดีตที่ผ่านมาฉันได้พบกับ Analog Devices DSP บางตัวซึ่งcharเป็น 16 บิต DSP เป็นบิตของสถาปัตยกรรมเฉพาะที่ฉันคิดว่า (จากนั้นอีกครั้งในขณะที่แอสเซมเบลอร์ที่เขียนด้วยมือสามารถเอาชนะสิ่งที่คอมไพเลอร์ C ที่มีอยู่สามารถทำได้ดังนั้นฉันจึงไม่ได้รับประสบการณ์มากกับ C บนแพลตฟอร์มนั้น)
136 c++  c  cross-platform 

8
C ++ Build Systems - ควรใช้อะไร? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ ฉันกำลังมองหาการเริ่มต้นโครงการใหม่ใน C ++ เพียงแค่ในช่วงเวลาของฉันเองในตอนแรกและฉันกำลังตรวจสอบระบบการสร้างที่พร้อมใช้งาน ดูเหมือนว่าคำตอบคือ "หลายคนและพวกเขาทั้งหมดน่ากลัว" คุณสมบัติที่ฉันต้องการเป็นพิเศษคือ: การสนับสนุน C ++ 11 Cross platform (Linux เป็นเป้าหมายหลัก แต่สามารถสร้างได้บน Windows อย่างน้อยเช่นกัน) สนับสนุนการทดสอบหน่วยที่เหมาะสม รองรับหลายโมดูลสำหรับการแยกรหัสออก รองรับการสร้างรหัส (ใช้ asn1c หรือ protobuf - ยังไม่แน่ใจ 100%) ดูแลรักษาง่าย ตอนนี้ฉันรู้ว่าฉันสามารถทำได้ 1-4 จากผู้ที่ใช้ CMake และ Autotools ได้ง่ายพอ อาจเป็นกับ SCons และ Waf …
136 c++  build 

16
ลบ [] รู้ได้อย่างไรว่าเป็นอาร์เรย์
เอาล่ะฉันคิดว่าเราทุกคนยอมรับว่าสิ่งที่เกิดขึ้นกับรหัสต่อไปนี้ไม่ได้กำหนดขึ้นอยู่กับสิ่งที่ส่งผ่าน void deleteForMe(int* pointer) { delete[] pointer; } ตัวชี้อาจเป็นสิ่งที่แตกต่างกันได้ดังนั้นการดำเนินการอย่างไม่มีเงื่อนไขdelete[]จึงไม่ได้กำหนดไว้ อย่างไรก็ตามสมมติว่าเรากำลังส่งตัวชี้อาร์เรย์ int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } คำถามของฉันคือในกรณีนี้ที่ตัวชี้เป็นอาร์เรย์ใครเป็นคนรู้เรื่องนี้ ฉันหมายถึงจากมุมมองของภาษา / คอมไพเลอร์ไม่มีความคิดว่าarrเป็นตัวชี้อาร์เรย์หรือไม่เมื่อเทียบกับตัวชี้ไปยัง int เดียว Heck ไม่รู้ด้วยซ้ำว่าarrถูกสร้างขึ้นแบบไดนามิกหรือไม่ แต่ถ้าฉันทำสิ่งต่อไปนี้แทน int main() { int* num = new int(1); deleteForMe(num); return 0; } ระบบปฏิบัติการมีความฉลาดพอที่จะลบเพียง int เดียวและไม่ใช้ 'ความสนุกสนานในการฆ่า' บางประเภทโดยการลบหน่วยความจำที่เหลือเกินกว่าจุดนั้น (ตรงกันข้ามกับสตริงที่strlenไม่มีการตัด\0ทอนและจะดำเนินต่อไปจนกว่าจะถึง ฮิต …

4
เป็นไปได้หรือไม่ที่จะหาประเภทพารามิเตอร์และประเภทผลตอบแทนของแลมด้า
เมื่อพิจารณาแลมบ์ดาเป็นไปได้ไหมที่จะหาประเภทพารามิเตอร์และประเภทการส่งคืน ถ้าใช่อย่างไร โดยพื้นฐานแล้วฉันต้องการlambda_traitsที่สามารถใช้ในรูปแบบต่อไปนี้: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long แรงจูงใจเบื้องหลังคือฉันต้องการใช้lambda_traitsในเทมเพลตฟังก์ชันซึ่งยอมรับแลมบ์ดาเป็นอาร์กิวเมนต์และฉันจำเป็นต้องรู้ว่าเป็นประเภทพารามิเตอร์และประเภทผลตอบแทนภายในฟังก์ชัน: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } …

4
ฉันจะเลือกคอนเทนเนอร์ไลบรารีมาตรฐานใน C ++ 11 อย่างมีประสิทธิภาพได้อย่างไร
มีรูปภาพที่รู้จักกันดี (ข้อมูลโกง) ที่เรียกว่า "C ++ Container choice" เป็นผังงานเพื่อเลือกภาชนะที่ดีที่สุดสำหรับการใช้งานที่ต้องการ มีใครรู้บ้างว่ามีเวอร์ชัน C ++ 11 อยู่แล้วหรือไม่? นี่คือรายการก่อนหน้า:
136 c++  c++11  c++-faq 

4
การเริ่มต้น C ++ เป็นศูนย์ - เหตุใด "b" ในโปรแกรมนี้จึงไม่ได้กำหนดค่าเริ่มต้น แต่มีการเริ่มต้นʻa`
ตามคำตอบที่ยอมรับ (และเท่านั้น) สำหรับคำถาม Stack Overflowนี้ การกำหนดตัวสร้างด้วย MyTest() = default; จะทำให้วัตถุเริ่มต้นเป็นศูนย์แทน แล้วทำไมต่อไปนี้ #include <iostream> struct foo { foo() = default; int a; }; struct bar { bar(); int b; }; bar::bar() = default; int main() { foo a{}; bar b{}; std::cout << a.a << ' ' << b.b; } สร้างผลลัพธ์นี้: 0 …

18
ใครจะใช้สหภาพเมื่อใด เป็นส่วนที่เหลือจากวัน C-only หรือไม่?
ฉันได้เรียนรู้ แต่ไม่ได้เข้าร่วมสหภาพ ข้อความ C หรือ C ++ ทุกข้อความที่ฉันผ่านแนะนำพวกเขา (บางครั้งก็ผ่านไป) แต่พวกเขามักจะให้ตัวอย่างที่เป็นประโยชน์น้อยมากว่าทำไมถึงใช้มัน สหภาพแรงงานจะมีประโยชน์ในกรณีที่ทันสมัย ​​(หรือแม้กระทั่งมรดก) เมื่อใด การคาดเดาเพียงสองข้อของฉันคือการเขียนโปรแกรมไมโครโปรเซสเซอร์เมื่อคุณมีพื้นที่ จำกัด มากในการทำงานหรือเมื่อคุณพัฒนา API (หรือสิ่งที่คล้ายกัน) และคุณต้องการบังคับให้ผู้ใช้ปลายทางมีเพียงอินสแตนซ์เดียวของวัตถุ / ประเภทต่างๆที่ ครั้งหนึ่ง. สองคนนี้เดาได้ใกล้เคียงกันหรือเปล่า?
136 c++  c  unions 

6
พิมพ์เทคนิคการลบ
(ด้วยการลบประเภทฉันหมายถึงการซ่อนข้อมูลประเภทบางส่วนหรือทั้งหมดเกี่ยวกับคลาสเช่นBoost อะไรก็ได้) ฉันต้องการใช้เทคนิคการลบประเภทในขณะเดียวกันก็แบ่งปันสิ่งเหล่านั้นซึ่งฉันรู้จัก ความหวังของฉันคือการได้พบกับเทคนิคบ้าๆที่ใครบางคนนึกถึงในชั่วโมงที่มืดมนที่สุดของเขา / เธอ :) แนวทางแรกและชัดเจนที่สุดและใช้กันทั่วไปที่ฉันรู้คือฟังก์ชันเสมือนจริง เพียงซ่อนการนำคลาสของคุณไปใช้ภายในลำดับชั้นคลาสที่ใช้อินเทอร์เฟซ ไลบรารี Boost จำนวนมากทำสิ่งนี้เช่นBoost สิ่งใดก็ตามที่ทำสิ่งนี้เพื่อซ่อนประเภทและBoostของคุณShared_ptrทำสิ่งนี้เพื่อซ่อนกลไกการจัดสรร (de) จากนั้นมีตัวเลือกที่มีฟังก์ชันพอยน์เตอร์ไปยังฟังก์ชันเทมเพลตในขณะที่ถือวัตถุจริงไว้ในvoid*ตัวชี้เช่นBoost ฟังก์ชันจะซ่อนประเภทจริงของ functor ตัวอย่างการใช้งานสามารถพบได้ในตอนท้ายของคำถาม ดังนั้นสำหรับคำถามที่แท้จริงของฉัน: คุณรู้เทคนิคการลบประเภทใดอีกบ้าง หากเป็นไปได้โปรดระบุรหัสตัวอย่างกรณีการใช้งานประสบการณ์ของคุณกับพวกเขาและลิงก์สำหรับการอ่านเพิ่มเติมหากเป็นไปได้ แก้ไข (เนื่องจากฉันไม่แน่ใจว่าจะเพิ่มสิ่งนี้เป็นคำตอบหรือเพียงแค่แก้ไขคำถามฉันจะทำแบบที่ปลอดภัยกว่านี้) อีกหนึ่งเทคนิคที่ดีในการซ่อนประเภทที่แท้จริงของบางสิ่งโดยไม่มีฟังก์ชันเสมือนจริงหรือการvoid*เล่นซอคือ GMan คนหนึ่งมีพนักงานที่นี่โดยมีความเกี่ยวข้องกับคำถามของฉันว่ามันทำงานอย่างไร รหัสตัวอย่าง: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. …
136 c++  type-erasure 


3
LLVM เทียบกับเสียงดังบน OS X
ฉันมีคำถามเกี่ยวกับ llvm, clang และ gcc บน OS X ความแตกต่างระหว่าง llvm-gcc 4.2, llvm 2.0 และ clang คืออะไร? ฉันรู้ว่าพวกเขาทั้งหมดสร้างขึ้นจาก llvm แต่มันแตกต่างกันอย่างไร? นอกจากคอมไพล์ได้เร็วขึ้นแล้ว llvm มีข้อดีกว่า gcc อย่างไร?
136 c++  c  gcc  llvm  clang 


30
จะตรวจสอบได้อย่างไรว่าสตริงเป็นตัวเลขที่มี C ++ หรือไม่?
ฉันมีปัญหาเล็กน้อยในการพยายามเขียนฟังก์ชันที่ตรวจสอบว่าสตริงเป็นตัวเลขหรือไม่ สำหรับเกมที่ฉันกำลังเขียนฉันเพียงแค่ต้องตรวจสอบว่าบรรทัดจากไฟล์ที่ฉันกำลังอ่านเป็นตัวเลขหรือไม่ (ฉันจะรู้ว่ามันเป็นพารามิเตอร์ด้วยวิธีนี้หรือไม่) ฉันเขียนฟังก์ชันด้านล่างซึ่งฉันเชื่อว่าทำงานได้อย่างราบรื่น (หรือฉันแก้ไขโดยไม่ตั้งใจเพื่อหยุดมันหรือฉันเป็นโรคจิตเภทหรือ Windows เป็นโรคจิตเภท): bool isParam (string line) { if (isdigit(atoi(line.c_str()))) return true; return false; }
136 c++  visual-c++ 

19
/usr/lib/libstdc++.so.6: ไม่พบเวอร์ชัน `` GLIBCXX_3.4.15 '
ฉันจะรับ GLIBCXX_3.4.15 ใน Ubuntu ได้อย่างไร ฉันไม่สามารถเรียกใช้บางโปรแกรมที่ฉันกำลังรวบรวมได้ เมื่อฉันทำ: strings /usr/lib/libstdc++.so.6 | grep GLIBC ฉันเข้าใจ: GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBC_2.2.5 GLIBC_2.3 GLIBC_2.4 GLIBC_2.3.4 GLIBC_2.3.2 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH ขอบคุณสำหรับความช่วยเหลือ!
135 c++  gcc  libstdc++ 

1
คัดลอก / ย้ายการกำหนดใน std :: vector :: erase () และ std :: deque :: erase ()
ในขั้นตอนของการตอบคำถามอื่นฉัน stumbled เมื่อกรมธรรม์ที่แตกต่างกันเล็กน้อยและstd::vector::erase()std::deque::erase() นี่คือสิ่งที่ C ++ 14 พูดเกี่ยวกับstd::deque::erase( [deque.modifiers]/4-6เน้นของฉัน): ผลกระทบ: ... ความซับซ้อน:จำนวนการเรียกใช้ตัวทำลายจะเหมือนกับจำนวนขององค์ประกอบที่ลบ แต่จำนวนการเรียกไปยังตัวดำเนินการกำหนดไม่เกินจำนวนองค์ประกอบที่น้อยกว่าก่อนองค์ประกอบที่ถูกลบและจำนวนองค์ประกอบหลังจาก องค์ประกอบที่ถูกลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ และนี่คือสิ่งที่กล่าวถึงเกี่ยวกับstd::vector::erase( [vector.modifiers]/3-5): ผลกระทบ: ... ซับซ้อน: destructor ของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบลบ แต่ผู้ประกอบการที่ได้รับมอบหมายย้ายของTที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบในเวกเตอร์หลังจากองค์ประกอบลบ โยน:Tไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ อย่างที่คุณเห็นข้อกำหนดข้อยกเว้นสำหรับทั้งสองอย่างนั้นเหมือนกัน แต่std::vectorมีการกล่าวถึงอย่างชัดเจนว่ามีการเรียกตัวดำเนินการกำหนดย้าย นอกจากนี้ยังมีความจำเป็นสำหรับการTที่จะเป็นMoveAssignableสำหรับerase()การทำงานกับทั้งstd::vectorและstd::deque(ตารางที่ 100) แต่นี่ไม่ได้หมายความถึงการปรากฏตัวของผู้ประกอบการที่ได้รับมอบหมายย้ายหนึ่งสามารถกำหนดผู้ประกอบการที่ได้รับมอบหมายคัดลอกและได้กำหนดดำเนินการกำหนดย้ายและชั้นนี้จะ เป็นMoveAssignable. ในกรณีนี้ฉันตรวจสอบด้วย GCC และ Clang และstd::vector::erase()เรียกตัวดำเนินการคัดลอกการมอบหมายงานหากไม่มีตัวดำเนินการกำหนดย้ายและstd::deque::erase()ทำแบบเดียวกัน ( DEMO ) คำถามคือ: ฉันพลาดอะไรไปหรือนี่เป็นปัญหา (บรรณาธิการ) ในมาตรฐาน? ปรับปรุง: ฉันได้ส่งlwg รุ่น #

10
C ++ 0x ไม่มี semaphores? จะซิงโครไนซ์เธรดได้อย่างไร?
C ++ 0x จะมาโดยไม่มี semaphores จริงหรือ? มีคำถามบางอย่างเกี่ยวกับ Stack Overflow เกี่ยวกับการใช้ semaphores อยู่แล้ว ฉันใช้มัน (posix semaphores) ตลอดเวลาเพื่อให้เธรดรอเหตุการณ์บางอย่างในเธรดอื่น: void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... } ถ้าฉันจะทำแบบนั้นกับ mutex: void thread0(...) { doSomething0(); event1.lock(); event1.unlock(); ... } void thread1(...) { event1.lock(); doSomethingth1(); event1.unlock(); ... } ปัญหา: มันน่าเกลียดและไม่รับประกันว่า …

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