Tag: gcc

理解警告“提升〜无符号与无符号的比较”

我遇到了一个我不太懂的警告。 通过比较我认为是无符号的和未签名的符号来生成警告。 这是来源: #include #include #include #include int main() { uint8_t *arr = malloc(8); assert(arr); /* fill arr[] with stuff */ if (arr[3] != (uint8_t)(~arr[2])) { // Warning is here /* stuff */ } return EXIT_SUCCESS; } 我使用以下过程构建的: user@linux:~ $ gcc -o test -Wall -Wextra test.c test.c: In function ‘main’: test.c:13:16: warning: comparison of promoted […]

GCC默认主要返回值不为零

我有一些C程序没有从main返回任何显式,如下所示: int main(int argc, char *argv[]) { // blah blah } 如果我使用GCC 4.6.3和以下选项编译它们: gcc file.c -Wall -Wextra 程序不返回0并给我带来问题,但标准(以及SO上的许多其他答案)说: 如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等效于调用exit函数,并将main函数返回的值作为其参数; [10] 到达}终止main函数返回值0 。 如果返回类型与int不兼容,则未指定返回到主机环境的终止状态。 [10]根据6.2.4,在main中声明的具有自动存储持续时间的物体的寿命将在前一种情况下结束,即使它们在后者中没有。 我的程序返回不同的值,160,15,14 ……垃圾? 我错过了什么吗? 这是GCC的错误吗? 在GCC在线文档中找不到任何内容。 GCC是否仍然指的是一些旧的C标准(前C99),这可能没有指定?

gcc不会警告无法访问的代码

我想知道为什么gcc(4.6.3)没有给我这个例子中无法访问的代码的警告: #include int status(void) { static int first_time = 1; if (first_time) { return 1; first_time = 0; /* never reached */ } else { return 0; } } int main(int argc, const char *argv[]) { printf(“first call %d\n”, status()); printf(“second call %d\n”, status()); return 0; } 注意,故障status()函数的目的是保持状态。 我曾期望通过-Wall得到警告。 我也试过了-Wunreachable-code , -Wextra , -pedantic和-ansi (正如这里所讨论的那样)。 […]

long long是8个字节,但是我得到整数溢出?

假设 long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits printf (“%lu\n”,sizeof(long long)); // prints 8 (bytes) = 64 bits 但编译器抱怨: warning: integer overflow in expression [-Woverflow] 为什么会溢出,我错过了什么?

中止陷阱:C程序中的6个

我在C中有一个程序。它成功编译并且运行正常但是在main()结束时,它崩溃并且给了我一个Abort trap: 6错误。 我对如何调试这个没有丝毫的线索。 关于SO与Abort trap: 6有关的几个问题Abort trap: 6错误对我没什么帮助。 一般来说,可能是什么问题? (我现在不愿意发布我的源代码,因为它大约有400行代码。如果我知道要查找什么,我会发布一段特定的代码。) 注意:我正在使用GCC在终端中运行程序。 但是当我在XCode中运行它时,我的程序崩溃,如果我停止它,它以exit code: 9结束exit code: 9 。 这是lldb的输出: Process 1191 stopped * thread #1: tid = 0xa759, 0x00007fff8fa08286 libsystem_kernel.dylib`__pthread_kill + 10, queue = ‘com.apple.main-thread’, stop reason = signal SIGABRT frame #0: 0x00007fff8fa08286 libsystem_kernel.dylib`__pthread_kill + 10 libsystem_kernel.dylib`__pthread_kill + 10: -> 0x7fff8fa08286: jae 0x7fff8fa08290 ; __pthread_kill […]

使用float格式说明符打印int变量

int main() { int a=5; float b=7.5; printf(“%d %f\n”,a,b); printf(“%d %f\n”,a,a); return 0; } 当我在gcc编译器中编译这个输出时是 5 7.500000 5 7.500000 但是在视觉工作室中,输出是 5 7.500000 5 0.000000 我无法理解gcc编译器输出。

C程序将变量名称作为输入和打印值

我有一个程序test.c int global_var=10; printf(“Done”); 我做到了 gcc -g test.c -o test 我的查询是否有一种方法可以将变量名称作为参数(比如“global_var”)并打印该值。 谢谢

自动内联翻译单元和gcc 4.6

如果我没有声明函数f为内联。 如下: 啊: X f(Y y); A.cpp: X f(Y y) { … } 然后在另一个翻译单元: B.cpp: #include “Ah” Z g(W w) { … … f(…) … … } 然后我用gcc 4.6编译两个翻译单元Ao和Bo,然后通过gcc链接它们。 (可能两个步骤都是-O3) gcc是否会考虑在链接时内联函数的function? 或者为时已晚? 在代码审查中有人建议我不应该将我的函数声明为内联函数,因为编译器比内联时更了解。 除非函数在头文件中定义,否则我总是会留下印象,因为编译器没有内联选项。 (如果C模式,C ++模式或gnu ++ 0x模式的答案不同,请同时指出这一点)

如何在C中正确链接以阻止符号被剥离?

我在与C中的库正确链接时遇到了一些问题。 我敢肯定这是我不完全理解的那些神秘的C链接规则之一,但我无法弄明白。 我有libn,我编译成一个静态库libn.a nm libn显示: doug@ninja:~/projects/libnw/build$ nm ../../libn/build/libn.a |grep nIndex 00000034 T nIndex 00000000 D nIndex_ 00000026 T nIndex_finalize 00000013 T nIndex_init 00000000 T nIndex_map 我也有libnw,这取决于libn。 libnw上的nm显示: doug@ninja:~/projects/libnw/build$ nm libnw.a |grep Index U nIndex 但是,当我编译一个针对libnw和libn的编程链接时,我得到: doug@ninja:~/projects/libnw/build$ make [ 70%] Built target nw [ 80%] Built target test-template Scanning dependencies of target test-Core [ 85%] Building […]

未找到链接到头文件的头文件。

我对Nvidia的OpenCl / Cuda框架有疑问,但我认为这是一个gcc链接问题。 opencl_hello_world.c示例文件使用以下头文件: #include “../OpenCL/common/inc/CL/opencl.h” 使用这些头文件的opencl.h : #include #include #include #include 所以所有头文件都在同一个文件夹中。 当我用gcc opencl_hello_world.c -std=c99 -lOpenCL编译时,我收到以下错误消息: error: ../OpenCL/common/inc/CL/cl.h: No such file or directory error: ../OpenCL/common/inc/CL/cl_gl.h: No such file or directory … 即使cl.h和其他头文件位于此文件夹中。 搜索过SO之后,我将opencl.h的包含更改为 #include “cl.h” #include “cl_gl.h” 我在这里阅读: gcc无法找到包含的标题 。 但是搞乱框架头文件似乎不怎么样? 处理这个问题的正确方法是什么?