Tag: gcc warning

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_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error message and exit the process lpDisplayBuf […]

隐含的function声明

当未包含正确的头文件时,GCC通常会产生此警告。 此链接 – > www.network-theory.co.uk/docs/gccintro/gccintro_19.html表示因为函数声明是隐式的(而不是通过标头显式声明),错误的参数类型实际上可以传递给函数,产生不正确的结果。 我不明白这一点。 这是否意味着编译器生成的代码将机器的字大小推送到堆栈上以供被调用者使用,并希望最好? 细节表示赞赏。

如何让GCC在进行函数调用时警告无数的参数?

我只是调试了一个C程序很长一段时间,却发现我在进行函数调用时错过了一个参数,所以垃圾填充了缺少的参数。 像这样的愚蠢错误确实令人沮丧,但我想编译器应该能够检测到这一点。 (C甚至不支持默认参数;即使在C ++中,也需要显式声明默认参数。) 更新:原型被发现也是错的…… 那么,是否有一个GCC标志用于警告不匹配的函数调用参数号? 我一直都有 – -pedantic和-pedantic ; 令人惊讶的是,这样一个明显的错误未被发现。 (实际上我认为GCC没有报告有一些原因,但我现在想不出来。) 令人尴尬的代码示例: static void dfs(); int main(int argc, const char *argv[]) { dfs(1); } static void dfs(int remain, int last) { // dfs } 我刚才发现的另一个发现是,如果原型包含参数,编译器将报告; 但原型碰巧不包含任何参数,然后编译器就滑倒了。

在#include指令结束时禁止GCC警告“额外令牌”

我正在用C语言编写一个程序,用于在HP NonStop机器上编译和运行。 但是,我想在运行Linux的工作站上进行主要开发。 HP NonStop C编译器需要非标准的#include指令,如下所示: #include nolist 对于每个#include指令,我的工作站的GCC抱怨: S88USF.c:139:21: warning: extra tokens at end of #include directive 我该怎样抑制这个特别警告? 注意:在SO上,已经提出了类似的问题,正确的答案是“不要让gcc首先抱怨任何理由”。 但是,在这种情况下,我明确地希望完全按原样使用#include指令。 我知道我在做什么,我只是不知道如何通知gcc。

抑制“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) ) […]

mingw printf尺寸规格字符h

Visual Studio有一个大小和距离规格图表 ,我可以这样做,使用h前缀指定单字节字符串,无论printf还是wprintf: int main() { char test[]= “abc”; _tprintf(_T(“%hs\n”),test); } 但是,如果我使用mingw gcc和-Wall编译相同的内容,我会得到以下警告: warning: format ‘%hs’ expects type ‘short int *’, but argument 2 has type ‘char *’ 我在做什么是一种可接受的方式来在mingw中指定单字节字符串? 谢谢 编辑 – 此问题已在下面详细解答。 简短的回答是肯定的,这是在mingw中指定单字节字符串的可接受方式,并且可以忽略警告。

Wunused-but-set-variable警告处理

我有以下代码,并在使用gcc-4.6进行编译时,我收到警告: 警告:变量’status’已设置但未使用[-Wunused-but-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); } 如果未设置_DEBUG_标志,则会收到警告。 任何想法如何解决此警告?

禁用不兼容选项的gcc警告

我很好奇是否有一个选项可以禁用关于参数对编译语言无效的gcc警告。 例如: cc1: warning: command line option “-Wno-deprecated” is valid for C++/Java/ObjC++ but not for C 我们的构建系统传递了我们在整个构建中全局决定的警告。 我们有C / C ++代码,并且在尝试查找实际警告时,警告会变得非常烦人。 有什么建议?

为什么将double赋值给int不会触发gcc警告?

int i = 3.1 / 2 即使使用-Wall选项也不会引起任何警告。有时,我想知道精确丢失的位置。为什么gcc不支持此警告,而msvc支持这个? 谢谢。 编辑:我的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=’TDM-2 mingw32′ –enable-sjlj-exceptions –with-bugurl=http://www.tdragon.net/recentgcc/bugs.php

为什么gcc -Wformat没有在unsigned 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 -Wformat (包含在-Wall )不会抱怨上面的程序,为什么呢? 这是一个错误,还是故意遗漏? 从gcc手册页: -Wformat 检查对”printf”和”scanf”等的调用,以确保提供的参数具有适合指定格式字符串的类型,并确保格式字符串中指定的转换有意义