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

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

2
การเรียกใช้วิธี java จาก c ++ ใน Android
ฉันพยายามเรียกเมธอด Java ง่ายๆจาก C ++ ในขณะที่ Java เรียกวิธีเนทีฟ นี่คือรหัส Java: public class MainActivity extends Activity { private static String LIB_NAME = "name"; static { System.loadLibrary(LIB_NAME); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.textview); tv.setText(this.getJniString()); } …

6
เหตุใด C ++ จึงไม่อนุญาตโครงสร้างที่ไม่ระบุตัวตน
คอมไพเลอร์ C ++ บางตัวอนุญาตให้ใช้สหภาพและโครงสร้างที่ไม่ระบุชื่อเป็นส่วนขยายของ C ++ มาตรฐาน มันเป็นน้ำตาลที่มีประโยชน์มากในบางครั้ง อะไรคือเหตุผลที่ป้องกันไม่ให้สิ่งนี้เป็นส่วนหนึ่งของมาตรฐาน? มี Roadblock ทางเทคนิคหรือไม่? ปรัชญา? หรือแค่ไม่เพียงพอที่จะต้องพิสูจน์? นี่คือตัวอย่างของสิ่งที่ฉันกำลังพูดถึง: struct vector3 { union { struct { float x; float y; float z; }; float v[3]; }; }; คอมไพเลอร์ของฉันจะยอมรับเรื่องนี้ แต่ก็เตือนว่า"นิรนาม struct / ยูเนี่ยน" เป็นส่วนขยายที่ไม่ได้มาตรฐานที่ C
93 c++  struct  unions 

10
วิธีการทำให้เกิดการถ่ายโอนข้อมูลหลักใน C / C ++ โดยทางโปรแกรม
ฉันต้องการบังคับให้ดัมพ์หลักที่ตำแหน่งเฉพาะในแอปพลิเคชัน C ++ ของฉัน ฉันรู้ว่าฉันทำได้โดยทำสิ่งที่ชอบ: int * crash = NULL; *crash = 1; แต่อยากทราบว่ามีวิธีที่สะอาดกว่านี้ไหม? ฉันกำลังใช้ Linux อยู่
93 c++  c  linux  coredump  abort 

2
ฟังก์ชันสำหรับโครงสร้าง C ++
โดยปกติเราสามารถกำหนดตัวแปรสำหรับโครงสร้าง C ++ ได้เช่นเดียวกับใน struct foo { int bar; }; เราสามารถกำหนดฟังก์ชันสำหรับโครงสร้างได้หรือไม่? เราจะใช้ฟังก์ชันเหล่านั้นอย่างไร?
93 c++  function  struct 

4
ส่ง shared_ptr <Derived> เป็น shared_ptr <Base>
วิธีใดที่ดีที่สุดในการส่งผ่านshared_ptrประเภทที่ได้รับไปยังฟังก์ชันที่ใช้shared_ptrประเภทฐาน โดยทั่วไปฉันส่งผ่านshared_ptrs โดยการอ้างอิงเพื่อหลีกเลี่ยงสำเนาที่ไม่จำเป็น: int foo(const shared_ptr&lt;bar&gt;&amp; ptr); แต่จะไม่ได้ผลถ้าฉันพยายามทำสิ่งที่ชอบ int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); ฉันสามารถใช้ foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); แต่ดูเหมือนว่าจะไม่เหมาะสมด้วยเหตุผลสองประการ: dynamic_castดูเหมือนว่าบิตมากเกินไปสำหรับการที่เรียบง่ายที่ได้รับการหล่อฐาน ตามที่ฉันเข้าใจdynamic_pointer_castสร้างสำเนา (แม้ว่าจะเป็นเพียงชั่วคราว) ของตัวชี้เพื่อส่งผ่านไปยังฟังก์ชัน มีทางออกที่ดีกว่านี้หรือไม่? อัปเดตสำหรับลูกหลาน: มันกลายเป็นปัญหาของไฟล์ส่วนหัวที่หายไป นอกจากนี้สิ่งที่ฉันพยายามทำต่อไปนี้ถือเป็นปฏิปักษ์ โดยทั่วไปแล้ว ฟังก์ชั่นที่ไม่ได้ส่งผลกระทบต่อชีวิตของวัตถุ (เช่นวัตถุที่ยังคงถูกต้องสำหรับระยะเวลาของฟังก์ชั่น) int foo(bar&amp; b)ควรจะใช้การอ้างอิงธรรมดาหรือตัวชี้เช่น ฟังก์ชั่นที่ใช้วัตถุ (เช่นเป็นผู้ใช้ขั้นสุดท้ายของวัตถุที่กำหนด) ควรใช้โดยค่าเช่นunique_ptr int foo(unique_ptr&lt;bar&gt; b)ผู้โทรควรstd::moveใส่ค่าลงในฟังก์ชัน ฟังก์ชั่นที่ขยายอายุการใช้งานของวัตถุควรใช้โดยค่าเช่นshared_ptr int foo(shared_ptr&lt;bar&gt; b)คำแนะนำตามปกติเพื่อหลีกเลี่ยงการอ้างอิงแบบวงกลมใช้ ดูรายละเอียดเกี่ยวกับ Back to Basicsของ …

12
วิธีตั้งค่าการทดสอบหน่วยสำหรับ Visual Studio C ++
ฉันมีปัญหาในการหาวิธีตั้งค่าเฟรมเวิร์กการทดสอบและใช้งานได้ในVisual Studio 2008สำหรับC++ชุดทดสอบหน่วยในตัว ลิงก์หรือบทช่วยสอนใด ๆ จะได้รับการชื่นชม

7
เหตุใดผู้คนจึงใช้ __ (ขีดล่างสองเท่า) ใน C ++ มาก
ฉันกำลังดูโค้ด C ++ โอเพนซอร์สและสังเกตเห็นคะแนนสองเท่าที่ใช้ในโค้ดส่วนใหญ่อยู่ที่จุดเริ่มต้นของชื่อตัวแปร return __CYGWIN__; แค่สงสัยว่ามีเหตุผลนี้หรือเป็นเพียงบางคน code style? ฉันจะคิดว่าฉันทำให้มันยากที่จะอ่าน

2
ผลลัพธ์ของ + = ใน C และ C ++ คืออะไร?
ฉันมีรหัสต่อไปนี้: #include &lt;stdio.h&gt; int main(int argc, char **argv) { int i = 0; (i+=10)+=10; printf("i = %d\n", i); return 0; } หากฉันพยายามรวบรวมเป็นแหล่ง C โดยใช้ gcc ฉันได้รับข้อผิดพลาด: error: lvalue required as left operand of assignment แต่ถ้าฉันรวบรวมเป็นซอร์ส C ++ โดยใช้ g ++ ฉันไม่ได้รับข้อผิดพลาดและเมื่อฉันเรียกใช้ไฟล์ปฏิบัติการ: i = 20 ทำไมพฤติกรรมต่างกัน?
93 c++  c 

6
extern inline ทำอะไร?
ฉันเข้าใจว่าinlineโดยตัวมันเองเป็นข้อเสนอแนะของคอมไพเลอร์และตามดุลยพินิจของมันอาจหรือไม่อาจอินไลน์ฟังก์ชันและมันจะสร้างรหัสออบเจ็กต์ที่เชื่อมโยงได้ด้วย ฉันคิดว่าstatic inlineมันเหมือนกัน (อาจหรืออาจไม่อินไลน์ก็ได้) แต่จะไม่สร้างโค้ดออบเจ็กต์ที่เชื่อมโยงได้เมื่ออินไลน์ (เนื่องจากไม่มีโมดูลอื่นที่สามารถเชื่อมโยงไปได้) สถานที่ที่ไม่extern inlineเหมาะสมลงในภาพหรือไม่ สมมติว่าฉันต้องการแทนที่มาโครตัวประมวลผลล่วงหน้าด้วยฟังก์ชันอินไลน์และต้องการให้ฟังก์ชันนี้อินไลน์ (เช่นเนื่องจากใช้มาโคร__FILE__และ__LINE__มาโครที่ควรแก้ไขสำหรับผู้เรียก แต่ไม่ใช่ฟังก์ชันที่เรียกว่านี้) นั่นคือฉันต้องการเห็นข้อผิดพลาดของคอมไพเลอร์หรือตัวเชื่อมโยงในกรณีที่ฟังก์ชันไม่ได้รับการอินไลน์ ไม่extern inlineทำเช่นนี้? (ฉันคิดว่าถ้าไม่เป็นเช่นนั้นจะไม่มีวิธีใดที่จะบรรลุพฤติกรรมนี้นอกจากการยึดติดกับมาโคร) มีความแตกต่างระหว่าง C ++ และ C หรือไม่? มีความแตกต่างระหว่างผู้จำหน่ายคอมไพเลอร์และเวอร์ชันต่างๆหรือไม่?

4
พารามิเตอร์เทมเพลตที่ไม่ใช่ประเภท
ฉันเข้าใจว่าพารามิเตอร์เทมเพลตที่ไม่ใช่ประเภทควรเป็นนิพจน์อินทิกรัลคงที่ มีใครช่วยส่องทำไมถึงเป็นอย่างนั้น? template &lt;std::string temp&gt; void foo() { // ... } error C2993: 'std::string' : illegal type for non-type template parameter 'temp'. ฉันเข้าใจว่านิพจน์ปริพันธ์คงที่คืออะไร อะไรคือสาเหตุที่ไม่อนุญาตประเภทที่ไม่คงที่เช่นstd::stringในตัวอย่างข้างต้น
93 c++  templates 

10
การเพิ่ม C ++ - เมื่อใดควรใช้ x ++ หรือ ++ x
ฉันกำลังเรียนรู้ C ++ และฉันได้เรียนรู้เกี่ยวกับการเพิ่มขึ้นเมื่อสักครู่ที่ผ่านมา ฉันรู้ว่าคุณสามารถใช้ "++ x" เพื่อเพิ่มส่วนก่อนและ "x ++" เพื่อทำหลังจากนั้น ถึงกระนั้นฉันก็ไม่รู้จริงๆว่าจะใช้ทั้งสองอย่างเมื่อใด ... ฉันไม่เคยใช้ "++ x" จริงๆและจนถึงตอนนี้สิ่งต่างๆก็ใช้ได้ดี - ดังนั้นฉันควรใช้เมื่อใด ตัวอย่าง: ในสำหรับลูปควรใช้ "++ x" เมื่อใด นอกจากนี้ใครบางคนสามารถอธิบายได้อย่างชัดเจนว่าการเพิ่มขึ้น (หรือการลดระดับ) ทำงานอย่างไร ฉันจะขอบคุณมันจริงๆ

8
ฉันจะใส่คำสั่งที่เพิ่มขึ้นสองคำสั่งใน C ++ 'for' loop ได้อย่างไร
ฉันต้องการเพิ่มตัวแปรสองตัวในforเงื่อนไข -loop แทนที่จะเป็นตัวแปรเดียว สิ่งที่ชอบ: for (int i = 0; i != 5; ++i and ++j) do_something(i, j); ไวยากรณ์ของสิ่งนี้คืออะไร?

21
แปลงเวกเตอร์ <int> เป็นสตริง
ฉันมีvector&lt;int&gt;คอนเทนเนอร์ที่มีจำนวนเต็ม (เช่น {1,2,3,4}) และฉันต้องการแปลงเป็นสตริงของแบบฟอร์ม "1,2,3,4" วิธีที่สะอาดที่สุดใน C ++ คืออะไร? ใน Python นี่คือวิธีที่ฉันจะทำ: &gt;&gt;&gt; array = [1,2,3,4] &gt;&gt;&gt; ",".join(map(str,array)) '1,2,3,4'
93 c++  vector  tostring 

7
การตรวจสอบเนื้อหาคอนเทนเนอร์มาตรฐาน (std :: map) ด้วย gdb
สมมติว่ามีสิ่งนี้: #include &lt;map&gt; int main(){ std::map&lt;int,int&gt; m; m[1] = 2; m[2] = 4; return 0; } ฉันต้องการตรวจสอบเนื้อหาของแผนที่ที่รันโปรแกรมจาก gdb หากฉันลองใช้ตัวดำเนินการตัวห้อยฉันจะได้รับ: (gdb) p m[1] Attempt to take address of value not located in memory. การใช้วิธีค้นหาไม่ได้ผลลัพธ์ที่ดีกว่า: (gdb) p m.find(1) Cannot evaluate function -- may be inlined มีวิธีที่จะทำให้สำเร็จหรือไม่?
93 c++  stl  map  gdb 

8
std :: map insert หรือ std :: map find?
สมมติว่าเป็นแผนที่ที่คุณต้องการเก็บรักษารายการที่มีอยู่ 20% ของเวลารายการที่คุณกำลังแทรกเป็นข้อมูลใหม่ มีข้อได้เปรียบในการทำ std :: map :: find แล้ว std :: map :: insert โดยใช้ iterator ที่ส่งคืนหรือไม่? หรือมันเร็วกว่าที่จะพยายามแทรกแล้วดำเนินการโดยขึ้นอยู่กับว่าตัววนซ้ำระบุว่าบันทึกนั้นหรือไม่ได้ใส่หรือไม่?
93 c++  optimization  stl  stdmap 

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