草庐IT

c++ - 为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组?

intmain(){chara[7]="Network";return0;}C中的字符串文字在内部以nul字符终止。所以,上面的代码应该给出一个编译错误,因为字符串文字Network的实际长度是8并且它不能放入char[7]数组中。但是,Ubuntu上的gcc(即使使用-Wall)编译此代码时不会出现任何错误或警告。为什么gcc允许这样做而不将其标记为编译错误?gcc仅在char数组大小小于字符串文字时发出警告(仍然没有错误!)。例如,它会发出警告:chara[6]="Network";[相关]VisualC++2012给出chara[7]的编译错误:1>d:\main.cpp(3):

c++ - 为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组?

intmain(){chara[7]="Network";return0;}C中的字符串文字在内部以nul字符终止。所以,上面的代码应该给出一个编译错误,因为字符串文字Network的实际长度是8并且它不能放入char[7]数组中。但是,Ubuntu上的gcc(即使使用-Wall)编译此代码时不会出现任何错误或警告。为什么gcc允许这样做而不将其标记为编译错误?gcc仅在char数组大小小于字符串文字时发出警告(仍然没有错误!)。例如,它会发出警告:chara[6]="Network";[相关]VisualC++2012给出chara[7]的编译错误:1>d:\main.cpp(3):

c++ - gcc 4.3.3 编译器选项默认启用

我已经从gcc版本4.0.3移动到4.3.3并意识到-mfpmath在gcc4.3.3中默认设置为sse。这实际上导致了我的应用程序中的错误。在4.0.3中,-mfpmath为387。我想知道如何获得gcc为给定版本启用的所有默认选项。如何在编译时转储gcc使用的所有选项集。这使我能够比较4.0.3和4.3.3版本。一般来说,如果我能知道在gcc中进行版本更改之前需要检查的完整列表,那就太好了。(因为这会影响性能和功能。) 最佳答案 gcc-Q-v只需一个基本的小c或cpp文件作为输入文件。应该给你一个默认传递给gcc的所有选项的大

c++ - gcc 4.3.3 编译器选项默认启用

我已经从gcc版本4.0.3移动到4.3.3并意识到-mfpmath在gcc4.3.3中默认设置为sse。这实际上导致了我的应用程序中的错误。在4.0.3中,-mfpmath为387。我想知道如何获得gcc为给定版本启用的所有默认选项。如何在编译时转储gcc使用的所有选项集。这使我能够比较4.0.3和4.3.3版本。一般来说,如果我能知道在gcc中进行版本更改之前需要检查的完整列表,那就太好了。(因为这会影响性能和功能。) 最佳答案 gcc-Q-v只需一个基本的小c或cpp文件作为输入文件。应该给你一个默认传递给gcc的所有选项的大

c++ - gcc:剥离未使用的功能

我注意到,有时即使我不使用iostream和相关的I/O库,我的Mingw生成的二进制文件仍然大得不合理。比如我写了一段代码只使用vector和cstdio,用-O2-flto编译,我的程序就可以了大到2MB!我运行nmmain.exe>e.txt并震惊地看到所有与iostream相关的函数。经过一番谷歌搜索,我学会了使用-ffunction-sections-Wl,-gc-sections,将程序大小从2MB减少到~300KB(如果使用-s,100+KB)。太棒了!为了进一步测试-ffunction-sections-Wl,-gc-sections的效果,这里再写一段代码:#incl

c++ - gcc:剥离未使用的功能

我注意到,有时即使我不使用iostream和相关的I/O库,我的Mingw生成的二进制文件仍然大得不合理。比如我写了一段代码只使用vector和cstdio,用-O2-flto编译,我的程序就可以了大到2MB!我运行nmmain.exe>e.txt并震惊地看到所有与iostream相关的函数。经过一番谷歌搜索,我学会了使用-ffunction-sections-Wl,-gc-sections,将程序大小从2MB减少到~300KB(如果使用-s,100+KB)。太棒了!为了进一步测试-ffunction-sections-Wl,-gc-sections的效果,这里再写一段代码:#incl

c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器

更新(2016年9月30日)gcc-6.2的Ubuntu版本((Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901)不再有这个问题。我正在使用gcc-6.1[1]((Ubuntu6.1.1-3ubuntu11~14.04.1)6.1.120160511)、GNUbinutils2.24和支持GLIBCXX_3.4.22的libstdc++的Ubuntu版本。即使在一个简单的“helloworld”程序中,指定sanitizer也不会强制使用黄金链接器。main.cpp#includeintmain(){std::cout编译和链接g++-fsanitiz

c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器

更新(2016年9月30日)gcc-6.2的Ubuntu版本((Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901)不再有这个问题。我正在使用gcc-6.1[1]((Ubuntu6.1.1-3ubuntu11~14.04.1)6.1.120160511)、GNUbinutils2.24和支持GLIBCXX_3.4.22的libstdc++的Ubuntu版本。即使在一个简单的“helloworld”程序中,指定sanitizer也不会强制使用黄金链接器。main.cpp#includeintmain(){std::cout编译和链接g++-fsanitiz

c++ - gcc和clang的重载解析差异涉及move构造函数和 'Derived(Base&&)'构造函数

GCC(用4.9测试)接受以下测试用例:structBase{};structDerived:Base{Derived();explicitDerived(constDerived&);explicitDerived(Derived&&);explicitDerived(constBase&);Derived(Base&&);};Derivedfoo(){Derivedresult;returnresult;}intmain(){Derivedresult=foo();}Clang(用3.5测试)拒绝它并显示以下错误消息:test.cpp:13:10:error:nomatchingc

c++ - gcc和clang的重载解析差异涉及move构造函数和 'Derived(Base&&)'构造函数

GCC(用4.9测试)接受以下测试用例:structBase{};structDerived:Base{Derived();explicitDerived(constDerived&);explicitDerived(Derived&&);explicitDerived(constBase&);Derived(Base&&);};Derivedfoo(){Derivedresult;returnresult;}intmain(){Derivedresult=foo();}Clang(用3.5测试)拒绝它并显示以下错误消息:test.cpp:13:10:error:nomatchingc