Questions tagged «gcc»

GCC是GNU编译器集合。它是Linux上针对C,C ++,Go,Fortran和Ada的事实上的标准编译器,并且还支持许多其他语言和平台。除编译器外,GCC还具有一个工具链(libc,libstdc ++,objdump,nm等),该工具链已在多个平台和系统上广泛使用。

5
gcc的__attribute __((packed))/ #pragma pack是否不安全?
在C语言中,编译器将按声明的顺序对结构的成员进行布局,并在成员之间或最后一个成员之后插入填充字节,以确保每个成员正确对齐。 gcc提供了语言扩展名,__attribute__((packed))它告诉编译器不要插入填充,从而使结构成员无法对齐。例如,如果系统通常要求所有int对象具有4字节对齐,则__attribute__((packed))可能导致int以奇数偏移量分配结构成员。 引用gcc文档: “ packed”属性指定变量或结构字段应具有最小的对齐方式-变量一个字节,一个字段一位,除非您使用“ aligned”属性指定更大的值。 显然,使用此扩展名可能会导致数据需求较小,但代码速度却很慢,因为编译器必须(在某些平台上)生成代码以一次访问一个未对齐的成员一个字节。 但是,在任何情况下这都不安全吗?编译器是否总是生成正确的(尽管速度较慢)代码以访问打包结构中未对齐的成员?是否在所有情况下都可能这样做?
164 c  gcc  pragma-pack 

5
为什么此循环会产生“警告:迭代3u调用未定义的行为”并输出多于4行?
编译此: #include <iostream> int main() { for (int i = 0; i < 4; ++i) std::cout << i*1000000000 << std::endl; } 并gcc产生以下警告: warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations] std::cout << i*1000000000 << std::endl; ^ 我知道有符号整数溢出。 我无法获得的是为什么i值被该溢出操作破坏了? 我已经阅读了以下答案:为什么在带有GCC的x86上整数溢出会导致无限循环?,但我仍然不清除,为什么出现这种情况-我得到“未定义”是指“任何事情都可能发生”,但有什么的根本原因这个特定的行为? 在线:http://ideone.com/dMrRKR 编译器: gcc (4.8)


14
升级到Mojave后,无法在Mac上编译C程序
我已经在终端上使用gcc命令来编译C程序,但是突然之间,在更新Mac操作系统(至macOS 10.14 Mojave和XCode 10.0)之后,我开始收到消息: test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. 我已经安装了gcc,因为可以在/usr/local/bin其中找到它,并且确实有一个gcc。我尝试在其他iMac上运行相同的文件,但没有任何问题。 我尝试运行xcode-select --install并已经安装,因此无法解决我现在遇到的问题。我猜测该路径是混乱的,因为gcc在我开始复制并粘贴来自其他资源的一些命令来解决此问题后似乎找不到该路径。 希望对此有所帮助。
159 c  macos  gcc  terminal 

3
LD_LIBRARY_PATH和LIBRARY_PATH
我正在构建一个简单的C ++程序,我想用它的最新版本临时替换系统提供的共享库,以进行开发和测试。 我尝试设置LD_LIBRARY_PATH变量,但链接器(ld)失败,并显示以下信息: / usr / bin / ld:找不到-lyaml-cpp 我期望它能工作,因为根据ld手册页: 链接器使用以下搜索路径来查找所需的共享库:...对于本机链接器,环境变量“ LD_LIBRARY_PATH”的内容... 然后,我尝试设置LIBRARY_PATH,并且有效。 根据GCC手册: LIBRARY_PATH的值是用冒号分隔的目录列表,非常类似于PATH。当配置为本地编译器时,如果无法使用GCC_EXEC_PREFIX找到特殊的链接器文件,则GCC会尝试搜索指定的目录。当在普通库中搜索-l选项时,使用GCC链接也会使用这些目录(但使用-L指定的目录排在最前面)。 正如(GCC)手册所建议的,LIBRARY_PATH可以工作,因为我与GCC链接。 但.. 由于我与gcc链接,为什么错误消息提示为什么调用ld? 具有两个目的相同的变量有什么意义?还有其他区别吗?
159 gcc  g++  ld 

3
函数声明不是原型
我有一个我创建的图书馆 mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); 在我的程序中,我尝试调用此库函数: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } 当我尝试编译该程序时,出现以下错误: 在myprogram.c中包含的文件中:1 mylib.h:2警告:函数声明不是原型 我正在使用: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) 我的问题是,声明函数原型的正确方法是什么?
158 c  gcc 

9
为什么从非空函数的末尾流出而不返回值不会产生编译器错误?
自从我多年前意识到,默认情况下不会产生错误(至少在GCC中),我一直想知道为什么? 我知道您可以发出编译器标志来产生警告,但是它不总是错误吗?对于非void函数不返回有效值,为什么有意义? 评论中要求的示例: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ...编译。
158 c++  c  gcc  g++ 

24
C的有用GCC标志
除了setting -Wall和setting之外-std=XXX,还有哪些真正有用的,但鲜为人知的编译器标志可用于C语言中? 我对任何其他警告和/或在某些情况下将警告转换为错误以最大程度地减少任何意外的类型不匹配特别感兴趣。
157 c  gcc  compiler-flags 



5
为什么增强的GCC 6优化器会破坏实用的C ++代码?
GCC 6具有新的优化程序功能:假定该this值始终不为null并基于此进行优化。 现在,值范围传播假定C ++成员函数的this指针为非null。这消除了常见的空指针检查,但也破坏了一些不合格的代码库(例如Qt-5,Chromium,KDevelop)。作为临时解决方法,可以使用-fno-delete-null-pointer-checks。使用-fsanitize = undefined可以识别错误的代码。 变更文档显然将此称为危险,因为它破坏了数量惊人的频繁使用的代码。 为什么这个新假设会破坏实用的C ++代码?粗心或不了解信息的程序员是否有特定的模式依赖于这种特定的未定义行为?我无法想象有人写作,if (this == NULL)因为那太不自然了。


2
gcc的快速数学实际上是做什么的?
我知道gcc的--ffast-math标志可以大大提高浮动操作的速度,并且超出了IEEE标准,但是我似乎无法找到有关启动时实际发生的情况的信息。谁能解释一些细节,或者给出一个清晰的例子,说明如果打开或关闭该标志会发生什么变化? 我确实尝试通过SO寻找类似问题,但找不到任何能解释快速数学原理的东西。

6
在else语句中,GCC的__builtin_expect有什么优势?
我碰到了一个#define他们用的__builtin_expect。 该文档说: 内置功能: long __builtin_expect (long exp, long c) 您可以__builtin_expect用来向编译器提供分支预测信息。通常,您应该更喜欢为此(-fprofile-arcs)使用实际的配置文件反馈,因为众所周知,程序员在预测其程序的实际执行效果方面很差。但是,在某些应用程序中很难收集此数据。 返回值是的值exp,应为整数表达式。内置的语义是预期的 exp == c。例如: if (__builtin_expect (x, 0)) foo (); 表示我们不期望调用foo,因为我们期望x为零。 那么为什么不直接使用: if (x) foo (); 而不是复杂的语法__builtin_expect?
144 c  linux  gcc  built-in 

11
使用过时的C编译器会带来安全风险吗?
我们生产中的一些构建系统没人关心,这些机器运行的是GCC 3或GCC 2等古老版本的GCC。 而且我不能说服管理层将其升级到最新版本:他们说,“如果还没有破产,就不要修复它”。 由于我们维护了非常古老的代码库(写于80年代),因此C89代码在这些编译器上可以很好地进行编译。 但是我不确定使用这些旧内容是个好主意。 我的问题是: 使用旧的C编译器会损害已编译程序的安全性吗? 更新: Visual Studio 2008为Windows目标构建了相同的代码,MSVC尚不支持C99或C11(我不知道是否有更新的MSVC支持),并且可以使用最新的GCC在Linux机器上构建它。因此,如果我们只使用更新的GCC,它的构建可能会和以前一样好。
139 c  security  gcc 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.