DEV-C++中的编译器错误
我编译了以下代码,该代码在我的C代码中用#include 声明,并且在DEV-C ++中收到以下编译器错误.我想编译器中应该有一些选择来解决此问题.有人可以帮助解决这个问题. 以下是我的示例代码,该代码是从MSDN站点获取的: #include #include void ErrorExit(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SY
0 2024-04-10
编程技术问答社区
什么原因导致编译器对未使用的函数发出警告?
简单设置:有n个原型用于功能和实现功能.有一系列功能指针.每个函数在此数组中列出.有些仍会引起 - 使用GCC时 - 功能. 代码: void foo1(void); void foo2(void); void bar1(void); void bar2(void); /* and their implementations */ void (*functions[])(void) = { foo1, foo2, bar1, bar2 }; 这就是设置的样子(只是一个示例)!现在,使用GCC编译时,此Foo/bar功能之一现在会引起 - 功能警告.其他人没有.为什么? 解决方案 -wunused-unction 每当声明静态函数但未定义或未使用非内部静态功能时,请警告.此警告由 -wall 启用. 当函数从未使用和时,该警告似乎触发了 和当声明函数时(原型)但未定义. 您确定您不会错过实施所声明的任何功能吗?
2 2024-04-09
编程技术问答社区
没有成员 编译错误
我有以下代码,当我尝试编译时,我会收到一个错误: 错误:" list_item_t"没有名为"状态" 的成员 有什么创意如何使此代码在没有警告和误差的情况下编译? #if defined (_DEBUG_) #define ASSERT assert #else /* _DEBUG_ */ #define ASSERT( exp ) ((void)(exp)) #endif` typedef struct list_item { struct list_item *p_next; struct list_item *p_prev; #ifdef _DEBUG_ int state; #endif } list_item_t; main(int argc, char *argv) { list_item_t p_list_item;
0 2024-04-09
编程技术问答社区
如何让GCC在进行函数调用时对不匹配的参数数发出警告?
我很长一段时间以来又调试了C程序,只是发现我在函数调用时错过了一个参数,所以垃圾而不是填写丢失的参数.像这样的愚蠢错误确实令人沮丧,但我想编译器应该能够检测到这一点. (C甚至不支持默认参数;即使在C ++中,也需要明确声明默认参数.) 更新:发现原型也是错误的... 那么,是否有用于警告无与伦比的函数呼叫参数编号的GCC标志?我总是有-Wall和-pedantic on;令人惊讶的是,这种明显的错误未被发现. (实际上,我想海湾合作委员会没有举报有某种原因,但我目前无法想到任何.) 令人尴尬的代码示例: static void dfs(); int main(int argc, const char *argv[]) { dfs(1); } static void dfs(int remain, int last) { // dfs } 我刚刚做出的另一个发现是,如果原型包
0 2024-04-09
编程技术问答社区
为什么海湾合作委员会不会为INT和CHAR产生类型的不匹配警告?
为什么在GCC中编译以下代码不会产生任何类型的不匹配警告? -1是类型 int ,f()期望类型 char : void f(char c) {} int main(void) { f(-1); return 0; } 即使我们明确指定类型,也没有警告: void f(unsigned char c) {} int main(void) { f((signed int)-1); return 0; } 什么是好奇:如果我们指定了范围的值,则打印警告: void f(char c) {} int main(void) { f(65535); return 0; } warning: overflow in implicit constant conversion GCC版本6.1.1 解决方案 似乎是GCC的Wconversion警告选项中的一个缺陷. 如果启用了,此警告选项警告作业: int i = c; /
2 2024-04-09
编程技术问答社区
确定具有与区域依赖性行为的C库函数的使用
我想删除具有与区域依赖性行为的功能的所有用途,以相似的功能代替它们,这些功能的行为就像其" C"语言环境中的库一样,无论该语言环境如何. . 这对于将程序制作到库中是必不可少的,即使将所有输入都具有相同的行为,即使链接到调用setlocale的程序中. 如何在GLIBC环境中获得GCC工具链,以为每个呼叫与语言环境依赖的C函数产生诊断? 这不仅可以用于进行初始转换,而且还可以在使用此类功能时立即捕获情况. 解决方案 每C 2018 5.2.1,源和执行字符集中的扩展字符是特定于区域的.因此,每个与字符一起使用的操作和功能都可能受到该语言环境的影响. 和中的所有功能均取决于本地. 对于仅在数值上起作用并对这些值的解释不可知的操作和功能,您可能会认为它们不受影响,而不管字符集中的字符是什么或具有什么值.例如,'ü' - 'ö'的结果是位置依赖性的,在包含这些字符的字符串上strcmp也是如此,但这是'ü'和'ö'的值的函
6 2024-04-09
编程技术问答社区
如何使MINGW GCC识别size_t的%ZU格式指定符?
图像值得一千个字: 我知道如何解决问题问题.但是如何在Microsoft 中修复它,以免警告? 编辑: 与其他人在委托中指出的内容相反,这是特定于 Microsoft 系统的.我可以在Linux计算机上运行完全相同的代码,在具有相同配置的VSCODE(tasks.json and Properties.json)中使用相同版本的GCC中的VSCODE,使用它,我不会收到这些编译器警告. 我正在使用的C标准是C17. 尝试使用格式依赖性函数(例如printf和scanf)中的"%z"(甚至是"%ll")之类的格式指定器将触发格式编译器警告,即使在完全更新(截至08/2021)中Windows 10 OS,带有最新的MINGW -64工具链(特别是GCC 8.1.0-这是此处使用的编译器). 图像中显示的"编译器错误"实际上只是一种格式警告被视为错误(引用编​​译器:" [-werror = format =]") 谢谢,"@the Busybee".您试图解决这个
10 2024-04-09
编程技术问答社区
为什么这段代码没有产生严格锯齿警告?
我有以下代码: struct A { short b; }; struct B { double a; }; void foo (struct B* src) { struct B* b = src; struct A* a = (struct A*)src; b->a = sin(rand()); if(a->b == rand()) { printf("Where are you strict aliasing warnings?\n"); } } 我正在使用以下命令行编译代码: gcc -c -std=c99 -Wstrict-aliasing=2 -Wall -fstrict-aliasing -O3 foo.c 我正在使用GCC 4.5.0.我希望编译器能打印出警告: warning: dereferencing type-punned pointer will
2 2024-04-08
编程技术问答社区
为什么将双倍数赋值给int不会引起gcc的警告?
int i = 3.1 / 2 即使使用-wall选项也不会引起任何警告. 谢谢. 编辑:我的gcc -v显示 Configured with: ../../gcc-4.4.1/configure --prefix=/mingw --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-registry --enable-libgomp --enable-cxx-flags='-fno-function-sections -fno-data-sections' --disable-werror --enable-threads --disable-symvers --enable-version-specific-runtime-libs --enable-fully-dynamic-string --with-pkgversion='T
0 2024-04-08
编程技术问答社区
未使用但已设置的变量警告处理
我有以下代码,在使用GCC-4.6编译时,我会得到警告: 警告:变量"状态"设置,但未使用[ - wunused in-set-variable] #if defined (_DEBUG_) #define ASSERT assert #else /* _DEBUG_ */ #define ASSERT( __exp__ ) #endif static inline void cl_plock(cl_plock_t * const p_lock) { status_t status; ASSERT(p_lock); ASSERT(p_lock->state == INITIALIZED); status = pthread_rwlock_unlock(&p_lock->lock); ASSERT(status == 0);
4 2024-04-08
编程技术问答社区
对不正确的printf格式指定符号产生警告
是否有任何方法可以获取GCC或Clang来生成与签名与未签名变量的不匹配的警告,并使用printf()格式指定? 我知道使用-Wformat,但是仅报告数据类型的大小不正确,该警告.如果仅符号不正确,它将不会产生警告. 例如 uint32_t x = UINT_MAX; printf("%d", x); 这将打印出-1. 似乎这是一个有用的警告,但是我还没有找到任何启​​用它的方法. 解决方案 使用:-Wformat以及-Wformat-signedness(必须存在 - 必须存在). 如果参数对printf指示符不正确,则后者警告选项将警告. gcc 6.2将产生此警告:警告:格式'%d'期望类型'int'的参数,但是参数2具有'uint32_t {aka unsigned int}'[-wformat =] 也应该是uint32_t x = UINT_MAX;是uint32_t x = UINT32_MAX; 其他解决方案 作为用
0 2024-04-08
编程技术问答社区
GCC不再实现<varargs.h>。
我必须将此代码片段从varargs.h更改为stdarg.h,但我不知道如何确切: #ifndef lint int ll_log (va_alist) va_dcl { int event, result; LLog *lp; va_list ap; va_start (ap); lp = va_arg (ap, LLog *); event = va_arg (ap, int); result = _ll_log (lp, event, ap); va_end (ap); return result; } 当我尝试构建此版本时,编译器说: error "GCC no longer implements ." error "Revise your code to use ." 我需要编译和运行的程序有一些类似的片段,我需要知道如何更改它们.
0 2024-04-08
编程技术问答社区
为什么gcc -Wformat对无符号int的printf %d没有警告?
以下程序具有未定义的行为: #include int main(void) { unsigned int x = -100; // This is fine, becomes UINT_MAX - 100 printf("%d\n", x); // This is undefined behavior. return 0; } c99 7.19.6.1p8状态%d期望一个INT参数. c99 7.19.6.1p9指出:"如果任何参数不是正确的类型 相应的转换规范,行为是 未定义的." 但是,gcc (-Wall中包含)不会抱怨上述程序,为什么?这是一个错误还是故意的遗漏? 来自GCC manpage: -Wformat 检查对"printf"和"scanf"等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换有意义 解决方案 我最好的猜测是,警告是因为UB被 valu
0 2024-04-08
编程技术问答社区
如何禁用一个没有命令行开关的gcc警告?
我得到以下警告: warning: 'X' is initialized and declared 'extern' 和看起来没什么大不了的,我可以将其禁用.在我的情况下,更改代码并不是一个好主意,因为我无法控制代码,我只需要编译它即可.所以我想禁用警告. 如果它旁边有一个-WSomeDefect键,那么我可以使用-Wno-SomeDefect命令行开关,但是此警告似乎没有明显的开关. 如何禁用此类警告? 解决方案 直接回答提出的问题: 从GCC的源代码可以看出,没有(半)特定的切换可以禁用此警告.它似乎仅通过禁用所有警告(-w)或通过-isystem作为系统标头进行禁用,这两者在被抑制的警告中都不具体. gcc 在这里打开元袋,适用于没有开关的类似警告案例在这里. P> 如果您不想使用两种非特异性抑制机制,那么您可能必须在额外的标志中修补gcc或等待对错误进行处理以禁用此特定警告. 其他解决方案 有数百个警告实例,它们充斥了编译器输出
0 2024-04-08
编程技术问答社区
| 忽略了目标的fPIC(所有代码都与位置无关),无用的警告
当我编译库时,我已经打开了-fPIC,因为我希望能够将其编译为共享和静态库. 在Cygwin上使用GCC 3.4.4我在所有源文件上都会警告: -fPIC ignored for target (all code is position independent) 我真的很想知道这是什么意义.它告诉我,我使用没有效果的开关,因为开关应该实现的目标已经完成.好吧,这意味着它是多余的,很好.但是,这是什么意义,我该如何抑制它? 我不是在谈论为什么使用图片,只是为什么它会生成IMO无用的警告. 解决方案 我真的想知道它的意义是什么... 我不是在谈论为什么使用PIC,只是为什么它会生成IMO无用的警告. 这是一个很好的问题,我还没有看到确定的答案. GCC开发人员中至少有一个认为它是毫无意义的警告.保罗·邦齐尼(Paolo Bonzini)称,他最近的补丁根据Jonathan Wakely在GCC邮件列表中的说法,网址为(2015年8月)下: 自2
4 2024-04-08
编程技术问答社区
"警告:假设循环不是无限的 "的解释是什么?
我刚刚决定将许多变量从unsigned更改为int,然后在重新编译有关代码时,请通过此警告消息来打招呼: freespace_state.c:203: warning: assuming that the loop is not infinite 有问题的行: for (x = startx; x ,GCC看来正在执行"不安全的循环优化"(并且因为设置了-funsafe-loop-optimizations而被警告).如果循环是无限,则该特定优
0 2024-04-08
编程技术问答社区
-fPIC对于目标来说被忽略了(所有代码都是独立于位置的),无用的警告
当我编译库时,我已经打开了-fPIC,因为我希望能够将其编译为共享和静态库. 在Cygwin上使用GCC 3.4.4我在所有源文件上都会警告: -fPIC ignored for target (all code is position independent) 我真的很想知道这是什么意义.它告诉我,我使用没有效果的开关,因为开关应该实现的目标已经完成.好吧,这意味着它是多余的,很好.但是,这是什么意义,我该如何抑制它? 我不是在谈论为什么使用图片,只是为什么它会生成IMO无用的警告. 解决方案 我真的想知道它的意义是什么... 我不是在谈论为什么使用PIC,只是为什么它会生成IMO无用的警告. 这是一个很好的问题,我还没有看到确定的答案. GCC开发人员中至少有一个认为它是毫无意义的警告.保罗·邦齐尼(Paolo Bonzini)称,他最近的补丁根据Jonathan Wakely在GCC邮件列表中的说法,网址为(2015年8月)下: 自2
0 2024-04-08
编程技术问答社区
如何禁用gcc警告 "cc1:警告:命令行选项'-std=c++11'对C++/ObjC++有效,但对C无效[默认启用]"
我是Cmake和GCC的新手. 我在公司新角色中的第一个任务是清理我们的Linux汇编中的错误 我做了大部分,现在我看到的唯一警告是 cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default] 我希望枯萎抑制警告或在CMAKE文件中解决问题. 不幸的是,我仍然没有找到适合此处的正确-Wno-xxx语句. 谢谢! 解决方案 代码发行警告可以用-Wno-xxx选项沉默,因为有时您无法控制源代码.但是警告告诉您,另一个命令行选项不能沉默命令行选项 - 如果您可以影响编译器调用,那么为什么不删除错误的选项? 此特定警告告诉您,在编译C代码时,您无法将标准设置为C ++ 11.要摆脱它,请找到在构建配置中定义-std=c++11的位置,并确保仅将其应用于C ++汇编,而不是用于C.等效.
14 2024-04-08
编程技术问答社区
函数声明为静态但从未定义
我有一个标题文件假设ABC.H,其中我的功能声明为: static int function1(); 我已将此标头文件包含在ABC.C中并定义了该功能并使用了. static int function1() { } 编译后,我会得到警告: warning: function1 declared static but never defined 我如何删除警告,而不会删除静态. 谢谢. 解决方案 可以在标题文件中声明静态函数,但这将导致每个源文件包含标头文件具有其自己的函数的私人副本,这可能不是预期的. 您确定您还没有在任何其他.c文件中包括 abc.h 文件? 因为将函数声明为静态,因此需要在包含其包含其包含的的所有 .c文件中定义该函数. 其他解决方案 良好的做法:在其定义的源文件中声明静态函数(也请提供原型),因为这是它们可见的唯一文件. 这样,该功能仅在该文件中可见,此类
2 2024-04-07
编程技术问答社区
GCC对存储类和类型的奇怪警告
我有一个看起来像 的标头文件 header.h int TOS; 仅由一个代码文件包含此文件 code.c #include "header.h" TOS=0; 编译代码时.CGCC发出警告 code.c:3:1:警告:数据定义没有类型或存储类[默认启用] Code.C:3:1:警告:在声明" TOS"(默认启用) 的声明中键入为" int"的默认值 我无法理解此警告的原因.在Code.c中声明和定义TOS是否等同于?即. code.c int TOS; TOS=0; 解决方案 这是因为您在全局范围中定义TOS,您需要定义TOS的类型(如果没有类型),默认情况下它是 . 这将导致conflicting type error, char x; x = 0; 其他解决方案 转发标题文件中变量的正确方法将为 extern int TOS; 没有extern这可能会导致TOS分配给几个汇编单元(.o文件).
0 2024-04-07
编程技术问答社区