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

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

4
รูปแบบไวยากรณ์ชนิดการส่งคืนต่อท้ายควรเป็นค่าเริ่มต้นสำหรับโปรแกรม C ++ 11 ใหม่หรือไม่ [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ C ++ 11 รองรับไวยากรณ์ของฟังก์ชันใหม่: auto func_name(int x, int y) -> int; ปัจจุบันฟังก์ชันนี้จะประกาศเป็น: int func_name(int x, int y); รูปแบบใหม่ดูเหมือนจะยังไม่ได้รับการยอมรับอย่างกว้างขวาง (พูดใน gcc stl) อย่างไรก็ตามควรใช้สไตล์ใหม่นี้ทุกที่ในโปรแกรม C ++ 11 ใหม่หรือจะใช้เมื่อจำเป็นเท่านั้น? โดยส่วนตัวแล้วฉันชอบรูปแบบเก่าเมื่อเป็นไปได้ แต่ฐานรหัสที่มีรูปแบบผสมดูค่อนข้างน่าเกลียด

3
C ++ ความแตกต่างระหว่าง std :: ref (T) และ T &?
ฉันมีคำถามเกี่ยวกับโปรแกรมนี้: #include <iostream> #include <type_traits> #include <functional> using namespace std; template <typename T> void foo ( T x ) { auto r=ref(x); cout<<boolalpha; cout<<is_same<T&,decltype(r)>::value; } int main() { int x=5; foo (x); return 0; } ผลลัพธ์คือ: false ฉันอยากรู้ว่าถ้าstd::refไม่ส่งคืนการอ้างอิงของวัตถุมันจะทำอย่างไร โดยทั่วไปความแตกต่างระหว่าง: T x; auto r = ref(x); และ T x; T &y …
92 c++  reference  ref 

5
ความแตกต่างระหว่าง std :: pair และ std :: tuple ที่มีสมาชิกเพียงสองคน?
มีความแตกต่างระหว่าง an std::pairและ an ที่std::tupleมีสมาชิกเพียงสองคนหรือไม่? (นอกจากชัดเจนว่าstd::pairต้องการสมาชิกสองคนและเพียงสองคนและtupleอาจมีมากกว่าหรือน้อยกว่า ... )


3
Constexpr เทียบกับมาโคร
ฉันควรใช้มาโครที่ไหนและฉันควรใช้constexprที่ไหน โดยพื้นฐานแล้วพวกเขาไม่เหมือนกันหรือ? #define MAX_HEIGHT 720 เทียบกับ constexpr unsigned int max_height = 720;
92 c++  c++11  macros  constexpr 

5
วิธีที่ถูกต้องในการประกาศตัวแปรตัวชี้ใน C / C ++ [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน9 ปีที่ผ่านมา ฉันสังเกตเห็นบางคนใช้สัญกรณ์ต่อไปนี้ในการประกาศตัวแปรตัวชี้ (a) char* p; แทน (b) char *p; ฉันใช้ (b) อะไรคือเหตุผลที่อยู่เบื้องหลังสัญกรณ์ (ก)? สัญกรณ์ (b) มีความหมายสำหรับฉันมากขึ้นเนื่องจากตัวชี้อักขระไม่ใช่ประเภทเอง แทนที่จะเป็นประเภทอักขระและตัวแปรอาจเป็นตัวชี้ไปยังอักขระ char* c; ดูเหมือนว่ามีประเภท char * และตัวแปร c เป็นประเภทนั้น แต่ในความเป็นจริงประเภทคือถ่านและ * c (ตำแหน่งหน่วยความจำที่ชี้โดย c) เป็นประเภทนั้น (ถ่าน) หากคุณประกาศตัวแปรหลายตัวพร้อมกันความแตกต่างนี้จะชัดเจน char* c, *d; มันดูแปลก ๆ ทั้ง c และ d เป็นพอยน์เตอร์ชนิดเดียวกันที่ชี้ไปที่อักขระ …
92 c++  c  pointers  coding-style 

16
แทนที่สตริงย่อยด้วยสตริงย่อย C ++ อื่น
ฉันจะแทนที่สตริงย่อยในสตริงด้วยสตริงย่อยอื่นใน C ++ ได้อย่างไรฉันจะใช้ฟังก์ชันอะไรได้บ้าง eg: string test = "abc def abc def"; test.replace("abc", "hij").replace("def", "klm"); //replace occurrence of abc and def with other substring

4
จะใช้อาร์กิวเมนต์มาโครเป็นสตริงลิเทอรัลได้อย่างไร
ฉันกำลังพยายามหาวิธีเขียนมาโครที่จะส่งทั้งการแทนค่าตัวอักษรสตริงของชื่อตัวแปรพร้อมกับตัวแปรในฟังก์ชัน ตัวอย่างเช่นให้ฟังก์ชันต่อไปนี้ void do_something(string name, int val) { cout << name << ": " << val << endl; } ฉันต้องการเขียนมาโครดังนั้นฉันจึงสามารถทำได้: int my_val = 5; CALL_DO_SOMETHING(my_val); ซึ่งจะพิมพ์ออกมา: my_val: 5 ฉันลองทำสิ่งต่อไปนี้: #define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); อย่างไรก็ตามอย่างที่คุณอาจเดาได้ว่า VAR ภายในเครื่องหมายคำพูดจะไม่ถูกแทนที่ แต่จะถูกส่งผ่านเป็นเพียงสตริง "VAR" ดังนั้นฉันต้องการทราบว่ามีวิธีที่จะทำให้อาร์กิวเมนต์มาโครกลายเป็นสตริงลิเทอรัลได้หรือไม่

3
exec เวอร์ชันต่างๆที่ใช้ใน C และ C ++ มีอะไรบ้าง?
นี่คือเวอร์ชันทั้งหมดของ exec ที่สามารถใช้ได้ใน C (และ C ++) execl execle execlp execv execve execvp อะไรคือความแตกต่างระหว่างพวกเขา? คุณรู้ได้อย่างไรว่าควรใช้อันไหน?
92 c++  c  exec 

6
ลำดับของการประเมินในพารามิเตอร์ฟังก์ชัน C ++
ถ้าเรามีฟังก์ชันสามอย่าง (foo, bar และ baz) ที่ประกอบกันเช่นนั้น ... foo(bar(), baz()) มีการรับประกันใด ๆ ตามมาตรฐาน C ++ ที่แถบจะได้รับการประเมินก่อน baz?
92 c++  standards 

6
จะอัพเดต std :: map ได้อย่างไรหลังจากใช้วิธีค้นหา
จะอัพเดตค่าของคีย์ในstd::mapหลังจากใช้findวิธีนี้ได้อย่างไร? ฉันมีแผนที่และการประกาศตัววนซ้ำดังนี้: map <char, int> m1; map <char, int>::iterator m1_it; typedef pair <char, int> count_pair; ฉันใช้แผนที่เพื่อจัดเก็บจำนวนครั้งที่เกิดขึ้นของตัวละคร ฉันใช้ Visual C ++ 2010
92 c++  map  stl  stdmap 

6
เหตุใดฉันจึงสามารถกำหนดโครงสร้างและคลาสภายในฟังก์ชันใน C ++ ได้
ฉันเพิ่งทำสิ่งนี้ผิดพลาดใน C ++ และมันก็ใช้ได้ ทำไมฉันถึงทำได้ int main(int argc, char** argv) { struct MyStruct { int somevalue; }; MyStruct s; s.somevalue = 5; } หลังจากทำสิ่งนี้แล้วฉันก็จำได้ว่าอ่านเคล็ดลับนี้ที่ไหนสักแห่งเมื่อนานมาแล้วว่าเป็นเครื่องมือการเขียนโปรแกรมที่ใช้งานได้ยากสำหรับ C ++ แต่ฉันจำไม่ได้ว่าทำไมมันถึงถูกต้องหรือฉันอ่านที่ไหน ยินดีต้อนรับคำตอบสำหรับคำถามใด ๆ ! หมายเหตุ: แม้ว่าเมื่อเขียนคำถามฉันไม่ได้รับการอ้างอิงใด ๆ เกี่ยวกับคำถามนี้แต่แถบด้านข้างปัจจุบันก็ชี้ให้เห็นดังนั้นฉันจะใส่ไว้ที่นี่เพื่ออ้างอิงไม่ว่าคำถามจะแตกต่างกัน แต่อาจมีประโยชน์


8
วิธีใช้ CCache กับ CMake
ฉันต้องการทำสิ่งต่อไปนี้: หากมี CCache อยู่ใน PATH ให้ใช้ "ccache g ++" สำหรับการคอมไพล์มิฉะนั้นให้ใช้ g ++ ฉันพยายามเขียนสคริปต์ my-cmake ขนาดเล็กที่มีไฟล์ CC="ccache gcc" CXX="ccache g++" cmake $* แต่ดูเหมือนจะไม่ทำงาน (การรัน make ยังไม่ใช้ ccache ฉันตรวจสอบสิ่งนี้โดยใช้ CMAKE_VERBOSE_MAKEFILE บน) อัปเดต: ตามลิงค์นี้ฉันพยายามเปลี่ยนสคริปต์ของฉันเป็น cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $* แต่ cmake บ่นว่าการทดสอบล้มเหลวในการใช้ ccache คอมไพเลอร์ (ซึ่งสามารถคาดหวังได้)
92 c++  unix  cmake  ccache 

9
เหตุใดจึงต้องออกแบบภาษาด้วยประเภทที่ไม่ระบุตัวตน
นี่เป็นสิ่งที่ทำให้ฉันติดขัดในฐานะคุณลักษณะของนิพจน์แลมบ์ดา C ++ ประเภทของนิพจน์แลมบ์ดา C ++ นั้นไม่เหมือนใครและไม่ระบุตัวตนฉันไม่สามารถเขียนมันลงไปได้ แม้ว่าฉันจะสร้างแลมบ์ดาสองตัวที่มีวากยสัมพันธ์เหมือนกันทุกประการ แต่ประเภทผลลัพธ์ก็ถูกกำหนดให้แตกต่างกัน ผลที่ตามมาคือ a) lambdas สามารถส่งผ่านไปยังฟังก์ชันเทมเพลตที่อนุญาตให้ส่งต่อเวลาคอมไพล์ประเภทที่ไม่สามารถบรรยายได้พร้อมกับออบเจ็กต์และ b) lambdas นั้นมีประโยชน์ก็ต่อเมื่อถูกลบผ่านประเภทstd::function<>เท่านั้น โอเค แต่นั่นเป็นเพียงวิธีที่ C ++ ทำฉันก็พร้อมที่จะเขียนมันออกมาเป็นเพียงคุณลักษณะที่น่ารำคาญของภาษานั้น อย่างไรก็ตามฉันเพิ่งเรียนรู้ว่า Rust ดูเหมือนจะเหมือนกัน: ฟังก์ชัน Rust หรือแลมบ์ดาแต่ละฟังก์ชันมีลักษณะเฉพาะและไม่ระบุตัวตน และตอนนี้ฉันสงสัยว่า: ทำไม? ดังนั้นคำถามของฉันคือ สิ่งนี้มีข้อดีอย่างไรจากมุมมองของนักออกแบบภาษาในการแนะนำแนวคิดของประเภทที่ไม่ซ้ำใครและไม่ระบุตัวตนในภาษา

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