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

GCC คือ GNU Compiler Collection มันเป็นคอมไพเลอร์มาตรฐานอย่างแท้จริงสำหรับ C, C ++, Go, Fortran และ Ada บน Linux และรองรับภาษาและแพลตฟอร์มอื่น ๆ อีกมากมายเช่นกัน นอกเหนือจากคอมไพเลอร์ GCC ยังมี toolchain (libc, libstdc ++, objdump, nm ฯลฯ ) ที่ใช้กันอย่างแพร่หลายในหลายแพลตฟอร์มและระบบ

1
gcc-10.0.1 Segfault เฉพาะ
ฉันมีแพ็คเกจ R ที่มีโค้ดที่คอมไพล์ C ซึ่งค่อนข้างเสถียรมาระยะหนึ่งแล้วและได้รับการทดสอบกับแพลตฟอร์มและคอมไพเลอร์ที่หลากหลาย (windows / osx / debian / fedora gcc / clang) เมื่อเร็ว ๆ นี้มีการเพิ่มแพลตฟอร์มใหม่เพื่อทดสอบแพคเกจอีกครั้ง: Logs from checks with gcc trunk aka 10.0.1 compiled from source on Fedora 30. (For some archived packages, 10.0.0.) x86_64 Fedora 30 Linux FFLAGS="-g -O2 -mtune=native -Wall -fallow-argument-mismatch" CFLAGS="-g -O2 -Wall -pedantic …

1
เหตุใดการเริ่มต้นรวม GCC ของอาร์เรย์จึงเติมเต็มทั้งศูนย์ด้วยก่อนรวมถึงองค์ประกอบที่ไม่ใช่ศูนย์
ทำไม gcc เติมทั้งอาร์เรย์ด้วยศูนย์แทนที่จะเป็นจำนวนเต็ม 96 เท่านั้นที่เหลือ? initializers ที่ไม่ใช่ศูนย์ทั้งหมดอยู่ที่จุดเริ่มต้นของอาร์เรย์ void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1 และ gcc9.2 สร้าง asm เช่นนี้ ( Godbolt …

2
มาโครแลมบ์ดาสร้างแลมบ์ดาได้อย่างไร
ฉันพบรหัสชิ้นนี้ใน GitHub แต่ไม่เข้าใจ: #define lambda(ret_type, _body) ({ ret_type _ _body _; }) แล้ว: int (*max)(int, int) = lambda(int, (int x, int y) { return x > y ? x : y; }); int max_value = max(1, 2); // max_value is 2 ขีดล่างทำในสิ่งใด#defineและมันคืนตัวชี้ฟังก์ชันได้อย่างไร

1
เสียงดังกราวไม่ได้รวบรวมรหัส แต่ gcc และ msvc รวบรวมไว้
ฉันไม่เข้าใจว่ามีปัญหาอะไร: ในโค้ดของฉันหรือในคอมไพเลอร์ (น้อยกว่านั้นเป็นไปได้) มีชิ้นส่วนของรหัสเช่นนี้: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } ทั้ง GCC และ MSVC รวบรวมมัน ผมทดสอบบน …

1
ทำไม GCC ไม่สามารถสันนิษฐานได้ว่า std :: vector :: size จะไม่เปลี่ยนแปลงในลูปนี้
ฉันอ้างว่าเป็นเพื่อนร่วมงานที่if (i < input.size() - 1) print(0);จะได้รับการเพิ่มประสิทธิภาพในวงนี้เพื่อที่input.size()จะไม่ได้อ่านทุกครั้ง แต่มันกลับกลายเป็นว่านี่ไม่ใช่กรณี! void print(int x) { std::cout << x << std::endl; } void print_list(const std::vector<int>& input) { int i = 0; for (size_t i = 0; i < input.size(); i++) { print(input[i]); if (i < input.size() - 1) print(0); } } ตามCompiler Explorerพร้อมตัวเลือก gcc …
14 c++  gcc  assembly 

5
เปรียบเทียบบิตกับบูลีน
ว่าฉันมีชุดของค่าสถานะการเข้ารหัสใน flagsuint16_t ตัวอย่างเช่นAMAZING_FLAG = 0x02. ตอนนี้ฉันมีฟังก์ชั่น ฟังก์ชั่นนี้ต้องตรวจสอบว่าฉันต้องการเปลี่ยนธงหรือไม่เพราะถ้าฉันต้องการทำเช่นนั้นฉันต้องเขียนเป็นแฟลช และนั่นก็มีราคาแพง ดังนั้นฉันต้องการการตรวจสอบซึ่งจะบอกฉันถ้ามีค่าเท่ากับflags & AMAZING_FLAG doSetนี่เป็นความคิดแรก: setAmazingFlag(bool doSet) { if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) { // Really expensive thing // Update flags } } นี่ไม่ใช่คำสั่งที่ใช้งานง่าย ฉันรู้สึกว่าควรจะมีวิธีที่ดีกว่าบางอย่างเช่น: if ((flags & AMAZING_FLAG) != doSet){ } แต่ตอนนี้ไม่ได้ทำงานจริงน่าจะเท่ากับtrue0x01 ดังนั้นมีวิธีที่เป็นระเบียบในการเปรียบเทียบบิตกับบูลีนหรือไม่?

1
ทำไมรหัสนี้ใช้เวลานานในการคอมไพล์ด้วย g ++
พิจารณารหัสต่อไปนี้: template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } เมื่อทำการเปรียบเทียบการคอมไพล์ด้วย g ++ โดยคำสั่ง Bash ต่อไปนี้ (ด้วย g ++ 8.3.0) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp …

4
มีข้อมูลโค้ด C ที่คำนวณการเพิ่มความปลอดภัยมากเกินไปอย่างมีประสิทธิภาพโดยไม่ใช้คอมไพเลอร์ builtins หรือไม่
นี่คือฟังก์ชั่น C ที่เพิ่มintอีกอันหนึ่งซึ่งล้มเหลวหากเกิดโอเวอร์โฟลว์: int safe_add(int *value, int delta) { if (*value >= 0) { if (delta > INT_MAX - *value) { return -1; } } else { if (delta < INT_MIN - *value) { return -1; } } *value += delta; return 0; } น่าเสียดายที่GCC หรือ Clang นั้นไม่ได้รับการปรับปรุงอย่างดี : safe_add(int*, …

1
การติดตั้งวงเล็บมุมของ GCC รวมถึง ทำไมต้องอธิบายตามด้านล่าง?
เอกสารนี้ในส่วนที่2.6 คำนวณรวมมีย่อหน้าต่อไปนี้: หากบรรทัดนั้นขยายไปยังสตรีมโทเค็นที่เริ่มต้นด้วย <โทเค็นและรวมถึงโทเค็น> โทเค็นที่อยู่ระหว่าง <และตัวแรก> จะรวมกันเพื่อสร้างชื่อไฟล์ที่จะรวม ช่องว่างใด ๆ ระหว่างโทเค็นจะถูกลดขนาดเป็นช่องว่างเดียว แล้วพื้นที่ใด ๆ หลังจากที่เริ่มต้น <จะถูกเก็บไว้ แต่พื้นที่ต่อท้ายก่อนปิด> ถูกละเว้น CPP ค้นหาไฟล์ตามกฎสำหรับการรวมวงเล็บมุม ฉันรู้ว่านี่เป็นการกำหนดการนำไปใช้ แต่ทำไมต้องเป็นเช่นนี้สำหรับ GCC ฉันหมายถึงเฉพาะประโยคที่เน้นสีด้านบน แก้ไข ฉันเพิ่งสังเกตเห็นว่าย่อหน้าที่สามก่อนที่จะยกมาข้างต้นกล่าวว่าต่อไปนี้: คุณต้องระวังเมื่อคุณกำหนดแมโคร #defineบันทึกโทเค็นไม่ใช่ข้อความ ตัวประมวลผลล่วงหน้าไม่มีทางรู้ได้ว่าแมโครจะถูกใช้เป็นอาร์กิวเมนต์#includeดังนั้นจึงสร้างโทเค็นสามัญไม่ใช่ชื่อส่วนหัว สิ่งนี้ไม่น่าจะทำให้เกิดปัญหาหากคุณใช้เครื่องหมายคำพูดคู่ซึ่งรวมถึงค่าคงที่ของสตริง ถ้าคุณใช้วงเล็บมุม แต่คุณอาจมีปัญหา ไม่มีใครรู้ว่าปัญหาแบบไหนที่ชี้ให้เห็นที่นี่?
11 c++  c  gcc  language-lawyer 

2
โค้ดตัวอย่างของ IBM ฟังก์ชั่นที่ไม่ใช่ผู้เข้าร่วมใหม่ไม่ทำงานในระบบของฉัน
ฉันกำลังศึกษาเรื่องการเขียนโปรแกรมอีกครั้ง บนเว็บไซต์ของ IBM (อันนี้ดีจริงๆ) ฉันได้ก่อตั้งรหัสแล้วคัดลอกด้านล่าง มันเป็นรหัสแรกที่นำมาลงเว็บไซต์ รหัสพยายามแสดงปัญหาที่เกี่ยวข้องกับการเข้าถึงตัวแปรในการพัฒนาเชิงเส้นของโปรแกรมข้อความ (asynchronicity) โดยการพิมพ์ค่าสองค่าที่เปลี่ยนแปลงตลอดเวลาใน "บริบทอันตราย" #include <signal.h> #include <stdio.h> struct two_int { int a, b; } data; void signal_handler(int signum){ printf ("%d, %d\n", data.a, data.b); alarm (1); } int main (void){ static struct two_int zeros = { 0, 0 }, ones = { 1, 1 …
11 c  gcc  signals  x86-64  data-race 

1
ทำไมคอมไพเลอร์ยืนยันที่จะใช้การลงทะเบียนที่บันทึกไว้ที่นี่?
พิจารณารหัส C นี้: void foo(void); long bar(long x) { foo(); return x; } เมื่อฉันรวบรวมใน GCC 9.3 ด้วย-O3หรือ-Osฉันได้รับ: bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret เอาท์พุทจากเสียงดังกราวเหมือนกันยกเว้นการเลือกrbxแทนr12การลงทะเบียน callee- บันทึก อย่างไรก็ตามฉันต้องการ / คาดหวังว่าจะเห็นชุดประกอบที่มีลักษณะดังนี้: bar: push rdi call foo pop rax ret ในภาษาอังกฤษนี่คือสิ่งที่ฉันเห็นว่าเกิดขึ้น: ผลักดันค่าเก่าของการลงทะเบียนที่บันทึกไว้แบบสลี ย้ายxไปยังการลงทะเบียนที่ถูกบันทึกด้วย callee โทร …
10 c  gcc  assembly  clang  x86-64 

3
สามารถแปลง nullptr เป็น uintptr_t ได้หรือไม่ คอมไพเลอร์ไม่เห็นด้วย
พิจารณาโปรแกรมนี้: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } ไม่สามารถคอมไพล์ด้วย msvc v19.24: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: …
10 c++  c++11  gcc  visual-c++  clang 

1
ปัญหาใน GCC / C ++ 17 พร้อมคลาสเทมเพลตเทมเพลต
พิจารณาโอเวอร์โหลด 2 ตัวต่อไปนี้ template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } อันที่หนึ่งใช้ได้กับคลาสปกติขณะที่อันที่สองใช้ได้กับเทมเพลตที่ไม่ได้สร้างอินสแตนซ์ ตัวอย่างเช่น std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ตอนนี้ให้พิจารณาฟังก์ชั่นเทมเพลตต่อไปนี้: template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } …
10 c++  templates  gcc  clang  c++17 

1
หน่วยความจำรั่วในระหว่าง unordered_map :: ใส่ข้อยกเว้น KeyEqual กับ GCC - ทำลายการรับประกันความปลอดภัยข้อยกเว้นที่รัดกุมหรือไม่
ฉันใช้ GCC 7.3.1 แต่ได้ทดสอบกับ coliru ด้วยซึ่งฉันเชื่อว่าเป็นรุ่น 9.2.0 สร้างด้วยสิ่งต่อไปนี้: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ที่นี่rai.cpp: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare …

2
การหักประเภทอัตโนมัติไม่ตรงกันระหว่างคอมไพเลอร์ c ++ ที่ต่างกัน
ดังนั้นฉันกำลังพยายามที่จะใช้ผลิตภัณฑ์ dot ( https://en.wikipedia.org/wiki/Dot_product ) ในบางรสชาติของ C ++ ที่ทันสมัยและมาพร้อมกับรหัสต่อไปนี้: #include <iostream> template<class... Args> auto dot(Args... args) { auto a = [args...](Args...) { return [=](auto... brgs) { static_assert(sizeof...(args) == sizeof...(brgs)); auto v1 = {args...}, i1 = v1.begin(); auto v2 = {brgs...}, i2 = v2.begin(); typename std::common_type<Args...>::type s = 0; while( i1 …

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