Tag: gcc

trigraph ?? / ignored,使用-trigraphs启用

我的编译器(gcc)给了我这个警告。 请帮我理解它的含义: 警告:trigraph ?? / ignored,使用-trigraphs启用

为什么编译器不再使用严格的别名来优化此UB

谷歌严格别名的第一个结果之一就是这篇文章http://dbp-consulting.com/tutorials/StrictAliasing.html 我注意到的一件有趣的事情是: http : //goo.gl/lPtIa5 uint32_t swaphalves(uint32_t a) { uint32_t acopy = a; uint16_t* ptr = (uint16_t*)&acopy; uint16_t tmp = ptr[0]; ptr[0] = ptr[1]; ptr[1] = tmp; return acopy; } 被编译为 swaphalves(unsigned int): mov eax, edi ret 由GCC 4.4.7。 任何比这更新的编译器(文章中提到的4.4所以文章没有错)都没有实现该函数,因为它可以使用严格别名。 这是什么原因? 它实际上是GCC中的错误还是GCC决定放弃它,因为许多行代码是以产生UB的方式编写的,或者它只是一个持续多年的编译器回归…而Clang也没有优化它。

错误:从’void *’转换为’int’会在makefile中丢失精度

在ubuntu 12.04 LTS(64位)上编译以下makefile时遇到此错误: Ana.cxx:21:46: error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 在这一行: 21 : TThread::Printf(“Start of Ana %x \n” ,(int)ptr); 这是makefile: ObjSuf = o SrcSuf = cxx DllSuf = so ExeSuf = OutPutOpt = -o CXXFLAGS = -g -Wall -fPIC -DOSF1 CXX = g++ CCFLAGS = -g -Wall -DOSF1 CC = gcc LD […]

为什么 – GCC中的-freciprocal-math不安全?

GCC中的-freciprocal-math更改以下代码 double a = b / c; 至 double tmp = 1/c; double a = b * tmp; 在GCC手册中,据说这种优化是不安全的,并且不符合IEEE标准。 但我想不出一个例子。 你能举个例子吗?

如何在预处理器中检测X32 ABI或环境?

X32是使用32位指针的amd64 / x86_64 CPU的ABI。 我们的想法是将较大的x86_64寄存器组与32位指针产生的较小内存和高速缓存占用空间相结合。 它提供高达约40%的加速。 有关详细信息并将其设置为chroot环境,请参阅Stack Overflow上的x86,x32和x64体系结构与Debian X32 Ports wiki页面之间的区别 。 我们在环境下有一个来自Debian维护者的错误报告。 报告是adcq是非法指令。 内联汇编是基于预处理器宏激活的,因此我们没有正确检测X32(或者更正确,直到现在都没有)。 对于预处理器宏,最明显的选择(对我来说)就像__X32__ ,但是没有提供。 基于Clang的补丁和Debian的建议 ,看起来可以使用__ILP32__ 。 但是我想要一个更规范的答案,因为_ILP32和__code_model_small__看起来也很有趣。 (我知道SSE2的问题,编译器支持它,但操作系统没有)。 在使用Clang和GCC时,可以使用哪些预处理器宏可靠地检测X32 ABI和环境? 要清楚,我现在不是要修改代码。 我只想知道可以在完全修复中使用的宏。 # cpp -dM < /dev/null | sort #define __amd64 1 #define __amd64__ 1 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_CONSUME 1 #define __ATOMIC_HLE_ACQUIRE 65536 #define __ATOMIC_HLE_RELEASE 131072 #define […]

我可以在我的Ubuntu 9.10上使用gcc与旧版本的Linux发行版交叉编译吗?

我有一些旧的硬件,上面运行着旧版的SuSE linux。 现在我有这台花哨的开发机器运行Ubuntu 9.10。 我用来编译我的C应用程序的一些工具(用Python 2.6.x编写)在旧的SuSe框中不可用。 那么……是否有可能在我的开发盒上编译那台旧机器? 我有以下几个步骤,但想在冒险进入这个任务之前进行交叉检查:1。找出我的应用程序需要哪些静态/共享库,并找到/构建它们的目标版本2.同时找到相应的头文件3.将正确的标志输入gcc以使用目标标头和库4.将正确的标志输入gcc以使用正确的体系结构(i386 / i686),或者我是否需要交叉编译工具链。 5.编译,上传和欣赏;-) 我经常使用avr-gcc和cc65,两者都是交叉编译。 我知道你设置了一个coss编译器来开发像gumstix这样的东西,所以它应该可以为旧的/其他Linux发行版做同样的事情,不是吗? C

在c中全局定义变量的extern

我有以下源代码,我感兴趣。 #include extern int foo; int foo = 32; int main() { printf(“%d”, foo); } 这是一段非常正常的代码,当我编译它时 gcc -Wall -Wextra -pedantic foo.c 我没有得到任何警告。 这似乎很奇怪,因为变量既被定义为外部变量又被定义为同一文件中的全局变量。 我很确定链接器很容易在同一个文件中找到外部变量的引用,但它看起来不像编码错误吗? 如果是这样,编译器为什么不警告这个呢?

编译器可以在使用未初始化的值时发出警告吗?

所以,让我说我粗心大意,做一个愚蠢的错字..这个文件: test.c的 #include int main() { int x = x; printf(“%d\n”,x); } 编译好: mymachine:~ oll$ gcc test.c mymachine:~ oll$ ./a.out 1782198366 显然int x = x是一个错误,但编译器在没有警告的情况下接受了这个错误。 我浪费了几个小时来尝试这个错误。 有一个编译器标志,并且可以用于gcc / g ++,当我使用未初始化的堆栈变量时,编译器会给我一个警告吗? 这有可能在将来节省我很多时间。 我试过gcc -O -Wuninitialized test.c – gcc -O -Wuninitialized test.c 。 提前致谢 编辑:我试过-Wall ,没有提到x mymachine:~ oll$ gcc -Wall test.c test.c: In function ‘main’: test.c:7: warning: […]

抑制“ISO C99需要使用rest参数”

考虑以下两个宏: #define PNORM( v, s, … ) { \ if( VERBOSITY_CHECK( v ) ) { \ if( ( errno = pthread_mutex_lock(&server.output_mutex) ) ) { \ PERROR_LOCKFREE( normal, “\tpthread_mutex_lock failed on output_mutex.\r\n” ) ; \ } \ fprintf( stdout, s, ## __VA_ARGS__ ) ; \ fflush( stdout ) ; \ if( ( errno = pthread_mutex_unlock(&server.output_mutex) ) […]

C全局静态变量初始化是由链接器完成的吗?

假设我们有: 在f1.c #include static int x = 10; void f1() { printf(“f1.c : %d\n”, x); } main.c中 extern void f1(); int main(int argc, char **argv) { f1(); return 0; } 我们将编译和读取两个ELF文件符号表(rel.ELF和exec ELF): $> gcc -c *.c $> readelf -s f1.o | grep x Num: Value Size Type Bind Vis Ndx Name 5: 0000000000000000 4 OBJECT […]