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

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


11
เหตุใดฉันจึงใช้ค่าลอยเป็นพารามิเตอร์เทมเพลตไม่ได้
เมื่อฉันพยายามใช้floatเป็นพารามิเตอร์เทมเพลตคอมไพลเลอร์จะร้องหารหัสนี้ในขณะที่intทำงานได้ดี เป็นเพราะฉันไม่สามารถใช้floatเป็นพารามิเตอร์เทมเพลตได้หรือไม่? #include<iostream> using namespace std; template <class T, T defaultValue> class GenericClass { private: T value; public: GenericClass() { value = defaultValue; } T returnVal() { return value; } }; int main() { GenericClass <int, 10> gcInteger; GenericClass < float, 4.6f> gcFlaot; cout << "\n sum of integer is …

2
โครงสร้างข้อมูล“ ล่วงล้ำ” หมายความว่าอย่างไร
ฉันเคยเห็นคำว่าล่วงล้ำใช้เพื่ออธิบายโครงสร้างข้อมูลเช่นรายการและสแต็ก แต่มันหมายความว่าอย่างไร คุณสามารถยกตัวอย่างรหัสของโครงสร้างข้อมูลที่ล่วงล้ำได้และแตกต่างจากโครงสร้างที่ไม่ล่วงล้ำอย่างไร นอกจากนี้เหตุใดจึงทำให้เป็นการล่วงล้ำ (หรือไม่ล่วงล้ำ) มีประโยชน์อย่างไร? มีข้อเสียอย่างไร?

9
C ++ IDE สำหรับ Mac [ปิด]
ตามที่กล่าวไว้ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันสอนหลักสูตร C ++ โดยใช้ Visual Studio นักเรียนคนหนึ่งของฉันมี Mac และกำลังมองหา IDE เพื่อใช้กับเครื่องของเขา มีอะไรดีจะแนะนำ?
120 c++  macos  ide 

2
std :: tie ทำงานอย่างไร?
ฉันใช้std::tieโดยไม่ต้องคิดมากกับมัน มันใช้งานได้ดังนั้นฉันจึงยอมรับว่า: auto test() { int a, b; std::tie(a, b) = std::make_tuple(2, 3); // a is now 2, b is now 3 return a + b; // 5 } แต่มนต์ดำนี้ทำงานอย่างไร? ชั่วคราวสร้างขึ้นโดยstd::tieการเปลี่ยนแปลงอย่างไรaและb? ฉันพบว่าสิ่งนี้น่าสนใจมากขึ้นเนื่องจากเป็นคุณลักษณะของไลบรารีไม่ใช่คุณลักษณะด้านภาษาดังนั้นจึงเป็นสิ่งที่เราสามารถนำไปใช้ได้ด้วยตนเองและเข้าใจ
120 c++  c++11  tuples 

7
ส่งไปยัง int vs floor
มีความแตกต่างระหว่างสิ่งเหล่านี้หรือไม่: float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0); ตามที่ฉันเข้าใจทั้งสองกรณีมีผลเหมือนกัน มีความแตกต่างในโค้ดที่คอมไพล์หรือไม่?
120 c++  c  floating-point 

8
เหตุใดฟังก์ชันอินไลน์ของ C ++ จึงอยู่ในส่วนหัว
หมายเหตุนี่ไม่ใช่คำถามเกี่ยวกับวิธีการใช้ฟังก์ชันแบบอินไลน์หรือวิธีการทำงานอีกต่อไปว่าทำไมพวกเขาถึงทำในแบบที่เป็นอยู่ การประกาศฟังก์ชันสมาชิกคลาสไม่จำเป็นต้องกำหนดฟังก์ชันเนื่องจากinlineเป็นเพียงการนำฟังก์ชันไปใช้งานจริงเท่านั้น ตัวอย่างเช่นในไฟล์ส่วนหัว: struct foo{ void bar(); // no need to define this as inline } เหตุใดการใช้ฟังก์ชันคลาสแบบอินไลน์จึงต้องอยู่ในไฟล์ส่วนหัว? เหตุใดฉันจึงไม่สามารถใส่ฟังก์ชันอินไลน์ใน.cppไฟล์ได้ ถ้าฉันพยายามใส่คำจำกัดความแบบอินไลน์ใน.cppไฟล์ฉันจะได้รับข้อผิดพลาดตามบรรทัดของ: error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

4
ข้อผิดพลาดคุณสมบัติพิเศษใน C ++
ฉันมีฟังก์ชันสมาชิกที่กำหนดไว้ดังนี้: Value JSONDeserializer::ParseValue(TDR type, const json_string& valueString); เมื่อฉันรวบรวมแหล่งที่มาฉันจะได้รับ: ข้อผิดพลาด: คุณสมบัติพิเศษ 'JSONDeserializer ::' ในสมาชิก 'ParseValue' นี่คืออะไร? ฉันจะลบข้อผิดพลาดนี้ได้อย่างไร
120 c++  g++  compiler-errors 

13
พิมพ์ call stack ใน C หรือ C ++
มีวิธีใดในการถ่ายโอนข้อมูลการโทรในกระบวนการทำงานใน C หรือ C ++ ทุกครั้งที่เรียกใช้ฟังก์ชันบางอย่าง สิ่งที่ฉันคิดไว้มีดังนี้: void foo() { print_stack_trace(); // foo's body return } สถานที่print_stack_traceทำงานคล้ายกับcallerใน Perl หรือสิ่งนี้: int main (void) { // will print out debug info every time foo() is called register_stack_trace_function(foo); // etc... } ที่register_stack_trace_functionวางเบรกพอยต์ภายในบางประเภทที่จะทำให้การติดตามสแต็กถูกพิมพ์เมื่อใดก็ตามที่fooถูกเรียก สิ่งนี้มีอยู่ในไลบรารี C มาตรฐานหรือไม่? ฉันทำงานบน Linux โดยใช้ GCC พื้นหลัง ฉันมีการทดสอบที่ทำงานแตกต่างกันไปตามสวิตช์บรรทัดคำสั่งบางอย่างที่ไม่ควรส่งผลต่อพฤติกรรมนี้ รหัสของฉันมีตัวสร้างตัวเลขสุ่มหลอกที่ฉันคิดว่าถูกเรียกแตกต่างกันไปตามสวิตช์เหล่านี้ ฉันต้องการเรียกใช้การทดสอบกับสวิตช์แต่ละชุดและดูว่าตัวสร้างตัวเลขสุ่มถูกเรียกแตกต่างกันหรือไม่สำหรับแต่ละอัน
120 c++  c  linux  callstack 

5
วิธีเปิดใช้งานการคอมไพล์ C ++ 17 ใน Visual Studio
ฉันต้องการใช้คุณสมบัติ C ++ 17 ฉันจะเปลี่ยนการคอมไพล์จาก C ++ 14 เป็น C ++ 17 ใน Microsoft Visual Studio ได้อย่างไร หรือไม่สามารถใช้งานได้ใน VS เวอร์ชันที่วางจำหน่าย?

1
วิธีสำนวนใน CMAKE ในการเพิ่มตัวเลือกคอมไพเลอร์ -fPIC คืออะไร?
ฉันเจออย่างน้อย 3 วิธีในการทำสิ่งนี้และฉันสงสัยว่าวิธีใดเป็นสำนวน สิ่งนี้จำเป็นต้องดำเนินการในระดับสากลกับไลบรารีแบบคงที่ ฉันแปลกใจที่ตัวสร้าง Makefile ใน CMake ไม่เพิ่มสิ่งนี้ลงในไลบรารีแบบคงที่โดยอัตโนมัติ (เว้นแต่ฉันจะพลาดอะไรไป?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") ฉันเชื่อว่าอาจมีรูปแบบอื่น ๆ (โปรดแก้ไขคำถามของฉันหากคุณพบ) หากคุณทราบคำตอบสำหรับคำถามนี้คุณทราบหรือไม่ว่ามีวิธีใดที่จะทำให้โครงการ CMake ของบุคคลที่สามถูกคอมไพล์ด้วยแฟล็กนี้โดยไม่ต้องแก้ไขไฟล์ CMakeLists.txt ฉันทำงานข้ามไลบรารีแบบคงที่โดยไม่มีแฟล็กนั้น ทำให้เกิดปัญหาเมื่อรวบรวมไลบรารีแบบคงที่ลงในไลบรารีไดนามิก คุณได้รับ: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
120 c++  c  cmake 

30
ประสิทธิภาพ C ++ เทียบกับ Java / C #
ล็อค คำถามนี้และคำตอบถูกล็อกเนื่องจากคำถามไม่ตรงประเด็น แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ยังไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ความเข้าใจของฉันคือ C / C ++ สร้างโค้ดเนทีฟเพื่อรันบนสถาปัตยกรรมเครื่องเฉพาะ ในทางกลับกันภาษาเช่น Java และ C # ทำงานบนเครื่องเสมือนซึ่งแยกสถาปัตยกรรมดั้งเดิมออกไป ดูเหมือนจะเป็นไปไม่ได้ที่ Java หรือ C # จะจับคู่ความเร็วของ C ++ เนื่องจากขั้นตอนกลางนี้อย่างไรก็ตามฉันได้รับแจ้งว่าคอมไพเลอร์ล่าสุด ("ฮอตสปอต") สามารถบรรลุความเร็วนี้หรือสูงกว่านั้นได้ บางทีนี่อาจเป็นคำถามเกี่ยวกับคอมไพเลอร์มากกว่าคำถามด้านภาษา แต่ใครก็ได้สามารถอธิบายเป็นภาษาอังกฤษแบบธรรมดาได้ว่าภาษาเครื่องเสมือนเหล่านี้จะทำงานได้ดีกว่าภาษาแม่หรือไม่
119 c#  java  c++  performance  bytecode 


3
การใช้คำหลักแบบอินไลน์กับเทมเพลตมีความหมายหรือไม่?
เนื่องจากเท็มเพลตถูกกำหนดไว้ภายในส่วนหัวและคอมไพเลอร์สามารถระบุได้ว่าการอินไลน์ฟังก์ชั่นนั้นมีประโยชน์หรือไม่มันสมเหตุสมผลหรือไม่? ฉันได้ยินมาว่าคอมไพเลอร์สมัยใหม่รู้ดีกว่าเมื่อต้องอินไลน์ฟังก์ชันและไม่สนใจinlineคำใบ้ แก้ไข: ฉันต้องการยอมรับทั้งสองคำตอบ แต่ไม่สามารถทำได้ เพื่อปิดปัญหาฉันยอมรับคำตอบของวลีเนื่องจากได้รับการโหวตมากที่สุดและเขาก็ถูกต้องอย่างเป็นทางการ แต่อย่างที่ฉันพูดถึงในความคิดเห็นฉันถือว่าคำตอบของPuppyและComponent 10เป็นคำตอบที่ถูกต้องเช่นกันจากมุมมองที่แตกต่างกัน . ปัญหาอยู่ในความหมายของ C ++ ซึ่งไม่เข้มงวดในกรณีของinlineคีย์เวิร์ดและอินไลน์ วลีระบุว่า "เขียนอินไลน์ถ้าคุณหมายถึง" แต่ความหมายที่แท้จริงinlineยังไม่ชัดเจนเนื่องจากมีการพัฒนาจากความหมายดั้งเดิมไปเป็นคำสั่งที่ว่า "หยุดคอมไพเลอร์ที่ยุ่งเกี่ยวกับการละเมิด ODR" ตามที่Puppyกล่าว
119 c++  templates  inline 

5
เหตุใดตัวดำเนินการด้านท้ายที่มีเครื่องหมายจุลภาคจึงประเมินเพียงนิพจน์เดียวในกรณีจริง
ฉันกำลังเรียนรู้ C ++ ด้วยหนังสือ C ++ Primer และหนึ่งในแบบฝึกหัดในหนังสือเล่มนี้คือ: อธิบายว่านิพจน์ต่อไปนี้ใช้ทำอะไร: someValue ? ++x, ++y : --x, --y เรารู้อะไรบ้าง? เราทราบดีว่าตัวดำเนินการ ternary มีลำดับความสำคัญสูงกว่าตัวดำเนินการลูกน้ำ ด้วยตัวดำเนินการไบนารีสิ่งนี้ค่อนข้างเข้าใจได้ง่าย แต่สำหรับตัวดำเนินการด้านท้ายฉันกำลังดิ้นรนเล็กน้อย ด้วยตัวดำเนินการไบนารี "มีลำดับความสำคัญสูงกว่า" หมายความว่าเราสามารถใช้วงเล็บรอบนิพจน์ที่มีลำดับความสำคัญสูงกว่าและจะไม่เปลี่ยนแปลงการดำเนินการ สำหรับตัวดำเนินการ ternary ฉันจะทำ: (someValue ? ++x, ++y : --x, --y) ทำให้เกิดรหัสเดียวกันอย่างมีประสิทธิภาพซึ่งไม่ได้ช่วยฉันในการทำความเข้าใจว่าคอมไพเลอร์จะจัดกลุ่มโค้ดอย่างไร อย่างไรก็ตามจากการทดสอบกับคอมไพเลอร์ C ++ ฉันรู้ว่านิพจน์นั้นรวบรวมและฉันไม่รู้ว่าตัว:ดำเนินการใดสามารถยืนได้ด้วยตัวเอง ดังนั้นคอมไพเลอร์ดูเหมือนจะตีความตัวดำเนินการ ternary อย่างถูกต้อง จากนั้นฉันดำเนินการโปรแกรมด้วยสองวิธี: #include <iostream> int main() { bool …

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