Tag: gcc

如何为我的自定义函数生成非null参数的警告?

我正在尝试编写一个库函数,其中参数不应为null,并希望gcc在某些人尝试传递NULL时应生成警告。 我的代码是 #include #include int own_strcmp(const char *str1, const char *str2) { if( str1 == NULL || str2 == NULL){ if(str1 == NULL && str2 == NULL) return 0; else if( str1 == NULL) return str2[0]; else return str1[0]; } int i=0; while(str1[i] && str2[i]){ if( str1[i] != str2[i]){ break; } i++; } return str1[i]-str2[i]; […]

结束gcc C Linux中第一个成功的线程

我是一位经验丰富的C程序员,以前从未使用过线程或并行。 我一直在读它,但我没有看到我想要的例子。 我在Mac和Linux上使用gcc C编译器。 我想在我的系统中用一个新的过程X2替换一个重要的过程X,它将启动两个方法,因为只要机器有多个CPU,这两天就会在两个不同的处理器上运行(大多数情况下都是这样)。 这两种方法可能共享一些全局变量,但它们不会写入除自己的堆栈之外的任何内存位置。 他们每个人都会调用系统中的许多其他程序。 我没有想到任何其他并行处理。 一旦任何一个线程完成,那就是它! 这就是答案。 X2应该立即杀死另一个线程并将答案返回给任何调用X2的人。 也许我天真但我认为这是一个众所周知的线程使用。 示例代码请!

execvpe函数的编译器警告

我有一个用c编写的程序,它使用execvpe(3)函数,我有一个行设置包含必需的头文件: #include 我使用以下命令编译此文件… gcc foo.c -o foo …只是为了得到以下警告: warning: implicit declaration of function ‘execvpe’ [-Wimplicit-function-declaration] 我遇到了与引用pthread_create(3)函数的文件类似的行为。 显然不同之处在于,pthread_create(3)手册页明确指出应该“编译并链接-pthread”,exec(3)函数族的手册页没有任何这样的指令。 此外,我在手册或在线中找不到exec(3)系列的类似编译器标志的任何参考。 我很感激您对此事的任何信息。 如果有一些标志我应该在编译时使用,或者如果我在寻找完全错误的解决方案,请告诉我。

为什么“gcc-std = c99 ……”不允许我使用VLA?

我正在尝试使用以下代码编译 gcc -c -g -std = c99 -MMD -MP -MF“build / Debug / Cygwin_4.x-Windows / main.od”-o build / Debug / Cygwin_4.x-Windows / main.o main.cpp 下面的代码在函数func中使用VLA,我认为应该由c99支持,我相信我通过标志-std = c99使用。 问题是,当我运行此操作时,我收到以下警告和错误: cc1plus:警告:命令行选项’-std = c99’对C / ObjC有效但对C ++无效 main.cpp:11:35:错误:在’]’之前使用函数体外的参数令牌void func(int a,int b,int arry [a] [b]){^ main.cpp:11:38:错误:在’]’之前使用函数体外的参数令牌void func(int a,int b,int arry [a] [b]){ 第一个警告让我怀疑gcc是否正在尝试将代码编译为c或c ++。 第二个让我觉得使用VLAfunction有问题,虽然我的理解是c99应该支持。 代码是: void func(int a, […]

compilin错误:字段必须具有常量:android 2.3.4源代码永远不支持’结构中的可变长度数组’扩展名

嗨我在android 2.3.4源代码中尝试make libdvm时出现以下错误, external/elfutils/libebl/eblobjnote.c:43:17: error: fields must have a constant size: ‘variable length array in structure’ extension will never be supported uint32_t version[descsz / 4 – 1]; 这是我的mac os x mountain lion上gcc 4.2报告的真正的c错误。 我猜有一些与gcc 4.2和android 2.3.4源代码不兼容。 我不得不改变一些事情来使编译达到这一点。 我不知道哪个gcc版本用于编译代码,但gcc 4.2经常在代码中发现错误。 任何人都可以告诉我如何处理这些错误,或者在最糟糕的情况下我应该使用哪个gcc版本以及如何降级到mac os x中的特定版本?

系统标头和普通标头gcc

我知道这是一个非常愚蠢的问题,但我无法区分gcc中的系统头和普通头。 参考此链接 : 2.8系统接头 声明操作系统和运行时库接口的头文件通常不能严格符合C语言编写。因此, GCC会给出系统头文件中的代码特殊处理 。 GCC处理系统标题时,除“#warning”(参见“诊断”)生成的警告外,所有警告都将被禁止。 系统标题中定义的宏在任何扩展的地方都不受几个警告的影响。 当我们发现警告由于系统头中定义的宏中的代码而产生大量误报时,会临时授予此免疫权。 通常,只有特定目录中的标头才被视为系统标头。 这些目录是在编译GCC时确定的。 但是,有两种方法可以将普通标头添加到系统标头中: 在使用-isystem和-idirafter命令行选项添加到搜索路径的目录中找到的头文件被视为用于诊断目的的系统头。 还有一个指令#pragma GCC system_header,它告诉GCC将当前包含文件的其余部分视为系统头,无论它在哪里找到。 文件中“#pragma”之前的代码不受影响。 #pragma GCC system_header对主源文件没有影响。 我很感激答案,如果可能的话,会显示系统标题的一些内容,以及在链接中讨论的是什么样的警告或特殊处理。

gcc优化复合语句

我在c中为通用可resize的向量实现push_back运算符时遇到问题。 对于通用性,我需要使用void指针作为参数,但实际上我想直接给它赋值。 当我使用gcc -ot test.c -std=c99编译下面的代码时,它会按照我的预期打印10 。 当我向编译选项添加-O1 (或更高版本)时,程序将打印0 。 我认为问题在于smemcpy代码,因为当我用memcpy替换它时我不再有这个问题。 简化代码: #include #include #define get_pointer(value) ({ __typeof__(value) tmp = value; &tmp; }) // copy from src to dst byte by byte void* smemcpy(void* dst, void const * src, size_t len) { char * pdst = (char *) dst; char const * psrc = (char […]

我们可以在很多行中编写宏而不用反斜杠吗?

我在CPP手册中看到了一些例子,我们可以在没有反斜杠的情况下在多行中编写宏体。 #define strange(file) fprintf (file, “%s %d”, … strange(stderr) p, 35) 输出: fprintf (stderr, “%s %d”, p, 35) 它们是特殊情况,如参数宏中的指令还是只允许#define? 对于include指令如果我没有错,它必须总是在一行上声明。 编辑: 来自https://gcc.gnu.org/onlinedocs/cpp/Directives-Within-Macro-Arguments.html 3.9宏观论证中的指令 有时,在宏的参数中使用预处理程序指令很方便 。 C和C ++标准声明在这些情况下的行为是未定义的。 GNU CPP处理宏参数中的任意指令的方式与处理指令的方式完全相同,类似函数的宏调用不存在。 如果在宏调用中重新定义了该宏,则新定义会在参数预扩展时及时生效,但原始定义仍用于参数替换。 这是一个病态的例子: #define f(x) xx f (1 #undef f #define f 2 f) 扩展到 1 2 1 2 用上面描述的语义。 这个例子很多。

为什么总是说“未定义参考”?

(我在Windows上。) 我正在使用C程序测试我编译的DLL( libsox ),它看起来像这样: #include #include “sox.h” int main(void) { char const * versionText = sox_version(); printf(versionText); return 0; } DLL中定义的函数在sox.h有以下原型(其中包含cdecl ): LSX_RETURN_VALID_Z LSX_RETURN_PURE char const * LSX_API sox_version(void); 这是问题所在:当我尝试使用gcc -lsox -o test.exe test.c构建文件时,出现以下错误: C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ccSS2h2z.o:test.c:(.text+0xf): undefined reference to `sox_version’ collect2: ld returned 1 exit status 一句话给-lsox :我在MinGW的lib文件夹中有库文件“libsox.dll.a”。 如果我写-lsoxnonsense ,那么它说没有库。 这意味着在所示的情况下,它找到了库。 那么为什么不想创建链接呢?

静态编译libc C代码和ASM代码

我有ASM代码: extern my_func extern printf extern exit global _start section .data … section .text _start: … call printf … call my_func … call exit 和C代码: int my_func(int a, int b) { return a+b; } 我在64位机器上使用fedora。 我希望可执行文件是32位。 对于动态链接我做: nasm -f elf32 asm.asm ; this gives me asm.o gcc -m32 -Wall -c c_code.c ; this gives me […]