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

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

9
วิธีที่สวยงามที่สุดในการเขียน 'if' แบบครั้งเดียว
เนื่องจาก C ++ 17 เราสามารถเขียนifบล็อกที่จะดำเนินการได้ทันทีดังนี้: #include <iostream> int main() { for (unsigned i = 0; i < 10; ++i) { if (static bool do_once = true; do_once) { // Enter only once std::cout << "hello one-shot" << std::endl; // Possibly much more code do_once = false; } } } ฉันรู้ว่าฉันอาจคิดมากเกินไปและมีวิธีอื่นในการแก้ปัญหานี้ …
138 c++  if-statement  c++17 

15
การประกาศสตริงเวลาคอมไพล์ใน C ++ อย่างสะดวกสบาย
ความสามารถในการสร้างและจัดการสตริงระหว่างเวลาคอมไพล์ใน C ++ มีแอพพลิเคชั่นที่มีประโยชน์มากมาย แม้ว่าจะสามารถสร้างสตริงเวลาคอมไพล์ใน C ++ ได้ แต่กระบวนการนี้ยุ่งยากมากเนื่องจากต้องประกาศสตริงเป็นลำดับตัวแปรของอักขระเช่น using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; การดำเนินการเช่นการต่อสายอักขระการแยกสตริงย่อยและอื่น ๆ อีกมากมายสามารถนำไปใช้งานได้อย่างง่ายดายเป็นการดำเนินการกับลำดับของอักขระ เป็นไปได้ไหมที่จะประกาศสตริงเวลาคอมไพล์สะดวกกว่า ถ้าไม่มีมีข้อเสนอในผลงานที่อนุญาตให้มีการประกาศสตริงเวลาคอมไพล์ได้อย่างสะดวกหรือไม่? เหตุใดแนวทางที่มีอยู่จึงล้มเหลว ตามหลักการแล้วเราต้องการที่จะสามารถประกาศสตริงเวลาคอมไพล์ได้ดังนี้: // Approach 1 using str1 = sequence<"Hello, world!">; หรือใช้ตัวอักษรที่ผู้ใช้กำหนดเอง // Approach 2 constexpr auto str2 = "Hello, …

1
ฟิวเจอร์สกับสัญญา
ฉันสับสนกับความแตกต่างระหว่างอนาคตกับคำสัญญา เห็นได้ชัดว่าพวกเขามีวิธีการและสิ่งต่าง ๆ แต่กรณีการใช้งานจริงเป็นอย่างไร? ใช่ไหม?: เมื่อฉันจัดการงาน async ฉันใช้อนาคตเพื่อรับค่า "ในอนาคต" เมื่อฉันเป็นงาน async ฉันใช้สัญญาเป็นประเภทการส่งคืนเพื่อให้ผู้ใช้ได้รับอนาคตจากสัญญาของฉัน
138 c++  c++11  promise  future 

3
จะเรียงด้วยแลมด้ายังไง?
sort(mMyClassVector.begin(), mMyClassVector.end(), [](const MyClass & a, const MyClass & b) { return a.mProperty > b.mProperty; }); ฉันต้องการใช้ฟังก์ชันแลมบ์ดาเพื่อจัดเรียงคลาสที่กำหนดเองแทนการผูกวิธีอินสแตนซ์ อย่างไรก็ตามรหัสด้านบนให้ข้อผิดพลาด: ข้อผิดพลาด C2564: 'const char *': การแปลงรูปแบบฟังก์ชันเป็นชนิดที่มีอยู่แล้วภายในสามารถรับอาร์กิวเมนต์เดียวเท่านั้น มันใช้งานได้ดีกับboost::bind(&MyApp::myMethod, this, _1, _2).
138 c++  sorting  lambda  char  const 

9
มีเหตุผลจริงหรือไม่ที่ทำให้เกิดการ && และ || มากเกินไป อย่าลัดวงจร?
พฤติกรรมการลัดวงจรของผู้ปฏิบัติงาน&&และ||เป็นเครื่องมือที่ยอดเยี่ยมสำหรับโปรแกรมเมอร์ แต่ทำไมพวกเขาถึงสูญเสียพฤติกรรมนี้เมื่อทำงานหนักเกินไป? ฉันเข้าใจว่าตัวดำเนินการเป็นเพียงน้ำตาลเชิงซ้อนสำหรับฟังก์ชั่น แต่ผู้ปฏิบัติงานboolมีพฤติกรรมนี้ทำไมจึงต้อง จำกัด ประเภทเดียวนี้ มีเหตุผลทางเทคนิคที่อยู่เบื้องหลังสิ่งนี้หรือไม่?

3
วิธีสร้าง Qt สำหรับ Visual Studio 2010
ฉันพยายามหาวิธีการที่ให้โซลูชันที่เสถียรสำหรับการใช้ Qt กับ Visual Studio 2010 ดังนั้นหลังจากรวบรวมบิตของข้อมูลทั้งหมดและการทดลองใช้และข้อผิดพลาดบางอย่างฉันต้องการเขียนวิธีแก้ปัญหาของฉันลงในคำแนะนำ ปัญหาหรือเหตุใดจึงไม่สามารถใช้ไบนารีที่สร้างไว้ล่วงหน้าได้ ดูเหมือนว่าการใช้ไบนารีที่สร้างขึ้นสำหรับ Visual Studio 2008 อาจทำงานในบางกรณีพิเศษ แต่ฉันพบว่ามันไม่ทำงาน ในกรณีของฉันพวกเขารวบรวมตกลง แต่พวกเขาผลิตข้อผิดพลาด runtime เช่นนี้ หรือเมื่อเริ่มต้นจาก Visual Studio 2010: อัปเดต : ฉันพบการโพสต์บล็อกวิเคราะห์ว่าทำไมจึงมีประโยชน์กับบางคนในขณะที่ไม่เหมาะกับคนอื่น ในหนึ่งคำขึ้นอยู่กับว่าคุณติดตั้ง Visual Studio 2008 บนเครื่องเดียวกันหรือไม่ http://blog.paulnettleship.com/2010/11/11/troubleshooting-visual-studio-2010-and-qt-4-7-integration/ สิ่งที่สำคัญที่สุด (ที่ฉันโง่อย่างไม่รู้ตัว) คือข้อเท็จจริงที่ว่าคุณไม่สามารถใช้ไลบรารีที่คอมไพล์ด้วย Visual Studio 2008 และ dll (มีอยู่ในเว็บเพจ Qt) หากคุณไม่ได้ติดตั้ง Visual Studio 2008 สาเหตุเป็นเพราะ Qt SDK ที่คุณดาวน์โหลดเป็นบิลด์การตรวจแก้จุดบกพร่องซึ่งขึ้นอยู่กับ VC9.0 …

10
วิธีการจำลองการเริ่มต้นอาร์เรย์ C“ int arr [] = {e1, e2, e3, …}” พฤติกรรมกับ std :: array?
(หมายเหตุ: คำถามนี้เป็นคำถามเกี่ยวกับการไม่ต้องระบุจำนวนขององค์ประกอบและยังคงอนุญาตให้มีชนิดที่ซ้อนกันที่จะเริ่มต้นได้โดยตรง.) คำถามนี้กล่าวถึงการใช้งานที่เหลือสำหรับอาร์เรย์ C int arr[20];เช่น ในคำตอบของเขา @James Kanze แสดงหนึ่งในฐานที่มั่นสุดท้ายของอาร์เรย์ C มันเป็นลักษณะการเริ่มต้นที่ไม่ซ้ำกัน: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; เราไม่ต้องระบุจำนวนองค์ประกอบไชโย! ทีนี้วนซ้ำด้วยฟังก์ชัน C ++ 11 std::beginและstd::endจาก<iterator>( หรือตัวแปรของคุณเอง ) และคุณไม่จำเป็นต้องคิดถึงขนาดของมัน ตอนนี้มีวิธีใดบ้าง (ที่เป็นไปได้ของ TMP) ในการบรรลุเป้าหมายเดียวกันstd::arrayหรือไม่? อนุญาตให้ใช้มาโครเพื่อทำให้ดูดีขึ้น :) ??? std_array = { …

9
เหตุใดจึงใช้ #ifndef CLASS_H และ #define CLASS_H ในไฟล์. h แต่ไม่ใช่ใน. cpp
ฉันเคยเห็นคนเขียน class.h #ifndef CLASS_H #define CLASS_H //blah blah blah #endif คำถามคือทำไมพวกเขาไม่ทำเช่นนั้นสำหรับไฟล์. cpp ที่มีคำจำกัดความสำหรับฟังก์ชันคลาส? สมมติว่าผมมี main.cppและรวมถึงmain.cpp ไฟล์ไม่ได้อะไรดังนั้นวิธีการที่ไม่ทราบว่าสิ่งที่อยู่ใน?class.hclass.hincludemain.cppclass.cpp
137 c++ 

7
ขนาดบิตยาวของ Windows 64 บิตคือเท่าใด
จะไม่นานที่ผ่านมามีคนบอกผมว่าlongไม่ได้ 64 บิต 64 intเครื่องบิตและฉันควรใช้ สิ่งนี้ไม่สมเหตุสมผลสำหรับฉัน ฉันเคยเห็นเอกสาร (เช่นที่อยู่ในเว็บไซต์อย่างเป็นทางการของ Apple) บอกว่าlongเป็น 64 บิตเมื่อรวบรวมสำหรับ CPU 64 บิต ฉันค้นหาสิ่งที่อยู่บน Windows 64 บิตและพบว่า Windows: longและintยังคงมีความยาว 32 บิตและมีการกำหนดชนิดข้อมูลใหม่พิเศษสำหรับจำนวนเต็ม 64 บิต (จากhttp://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 ) ฉันควรใช้อะไร ฉันควรกำหนดสิ่งที่ต้องการuw, sw((un) ความกว้างที่มีการเซ็นlongชือ) เป็นถ้าไม่ได้อยู่ใน Windows และควรตรวจสอบบิตซีพียูเป้าหมายหรือไม่
137 c++  c  windows  64-bit  porting 

9
เหตุใดฟังก์ชัน C จึงไม่สามารถเปลี่ยนชื่อได้
ฉันมีการสัมภาษณ์เมื่อเร็ว ๆ นี้และมีคำถามหนึ่งที่ถามคือการใช้extern "C"รหัส C ++ คืออะไร ฉันตอบว่ามันคือการใช้ฟังก์ชั่น C ในรหัส C ++ เนื่องจาก C ไม่ใช้ name-mangling ฉันถูกถามว่าทำไม C ถึงไม่ใช้ชื่อเล่นและพูดตามตรงว่าฉันไม่สามารถตอบได้ ฉันเข้าใจว่าเมื่อคอมไพเลอร์ C ++ รวบรวมฟังก์ชันมันตั้งชื่อพิเศษให้กับฟังก์ชันเป็นหลักเนื่องจากเราสามารถมีฟังก์ชันที่มีชื่อเดียวกันมากเกินไปใน C ++ ซึ่งต้องได้รับการแก้ไขในเวลาคอมไพล์ ใน C ชื่อของฟังก์ชันจะยังคงเหมือนเดิมหรืออาจจะมีเครื่องหมาย _ นำหน้า คำถามของฉันคือ: เกิดอะไรขึ้นกับการอนุญาตให้คอมไพเลอร์ C ++ ทำลายฟังก์ชัน C ด้วย ฉันจะเดาว่ามันไม่สำคัญว่าคอมไพเลอร์จะตั้งชื่ออะไรให้กับพวกเขา เราเรียกฟังก์ชันในลักษณะเดียวกันในภาษา C และ C ++
137 c++  c  name-mangling  extern-c 

9
ฟังก์ชันวนซ้ำสามารถอยู่ในบรรทัดได้หรือไม่?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } ขณะที่ฉันกำลังอ่านสิ่งนี้พบว่าโค้ดด้านบนจะนำไปสู่ ​​"การรวบรวมแบบไม่มีที่สิ้นสุด" หากไม่ได้รับการจัดการโดยคอมไพเลอร์อย่างถูกต้อง คอมไพลเลอร์ตัดสินใจอย่างไรว่าจะอินไลน์ฟังก์ชันหรือไม่?

9
C ++ แปลงสตริงฐานสิบหกเป็นจำนวนเต็มที่ลงนาม
ฉันต้องการแปลงสตริงฐานสิบหกเป็นจำนวนเต็ม 32 บิตเซ็นชื่อใน C ++ ตัวอย่างเช่นฉันมีสตริงเลขฐานสิบหก "fffefffe" การแทนค่าฐานสองของสิ่งนี้คือ 11111111111111101111111111111110 การแสดงเลขจำนวนเต็มที่มีลายเซ็นคือ: -65538 ฉันจะแปลงนี้ใน C ++ ได้อย่างไร สิ่งนี้จำเป็นต้องใช้กับตัวเลขที่ไม่เป็นลบ ตัวอย่างเช่นสตริงเลขฐานสิบหก "0000000A" ซึ่งเป็น 00000000000000000000000000001010 เป็นเลขฐานสองและ 10 ในฐานสิบ
137 c++  integer  hex  signed 

3
อะไรคือความแตกต่างระหว่าง packaged_task และ async
ในขณะที่ทำงานกับโมเดลเธรดของ C ++ 11 ฉันสังเกตเห็นว่า std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; }); auto f = task.get_future(); task(2,3); std::cout << f.get() << '\n'; และ auto f = std::async(std::launch::async, [](int a, int b) { return a + b; }, 2, 3); std::cout << f.get() << '\n'; ดูเหมือนจะทำในสิ่งเดียวกัน ฉันเข้าใจว่าอาจมีความแตกต่างที่สำคัญถ้าฉันวิ่งไปstd::asyncด้วยstd::launch::deferredแต่ในกรณีนี้มีไหม …

11
ทำไมเราต้องใช้ภายนอก“ C” {#include <foo.h>} ใน C ++
ทำไมเราต้องใช้: extern "C" { #include &lt;foo.h&gt; } โดยเฉพาะ: เมื่อใดที่เราควรใช้ เกิดอะไรขึ้นในคอมไพเลอร์ / ลิงเกอร์ระดับที่ต้องการให้เราใช้มัน? วิธีการรวบรวม / เชื่อมโยงนี้จะแก้ปัญหาที่เราต้องใช้มันได้อย่างไร?

15
การหา 32 vs 64 บิตใน C ++
ฉันกำลังมองหาวิธีที่เชื่อถือได้ตรวจสอบว่ารหัส C ++ จะถูกรวบรวมใน 32 vs 64 บิต เราเกิดขึ้นกับสิ่งที่เราคิดว่าเป็นวิธีแก้ปัญหาที่สมเหตุสมผลโดยใช้มาโคร แต่ก็อยากรู้ว่าคนอื่นจะนึกถึงกรณีที่อาจล้มเหลวหรือมีวิธีที่ดีกว่าในการทำเช่นนี้ โปรดทราบว่าเรากำลังพยายามทำสิ่งนี้ในสภาพแวดล้อมคอมไพเลอร์แบบหลายแพลตฟอร์ม #if ((ULONG_MAX) == (UINT_MAX)) # define IS32BIT #else # define IS64BIT #endif #ifdef IS64BIT DoMy64BitOperation() #else DoMy32BitOperation() #endif ขอบคุณ

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