gcc 常见的编译警告与错误(按字母顺序排列)C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。
有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。
需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。
为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照(英文按字典顺序排列),并对部分错误与警告做了必要的解释。
#%s expects \FILENAME\ or …#%s 需要\FILENAME\ 或…#%s is a deprecated GCC extension#%s 是一个已过时的GCC 扩展#%s is a GCC extension#%s 是一个GCC 扩展#~ error:#~ 错误:#~ In file included from %s:%u#~ 在包含自%s:%u 的文件中#~ internal error:#~ 内部错误:#~ no newline at end of file#~ 文件未以空白行结束#~ warning:#~ 警告:#elif after #else#elif 出现在#else 后#elif without #if#elif 没有匹配的#if#else after #else#else 出现在#else 后#else without #if#else 没有匹配的#if#endif without #if#endif 没有匹配的#if#include nested too deeply#include 嵌套过深#include_next in primary source file#include_next 出现在主源文件中#pragma %s %s is already registered#pragma %s %s 已经被注册#pragma %s is already registered#pragma %s 已经被注册#pragma once in main file#pragma once 出现在主文件中#pragma system_header ignored outside include file#pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的Unicode 字符%s in preprocessing directive预处理指示中出现%s%s is a block device%s 是一个块设备%s is shorter than expected%s 短于预期%s is too large%s 过大%s with no expression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’%s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: not used because `%.*s’ not def ined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在C++ 中“%s”会是“%s”的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after # is not a positive integer# 后的“%s”不是一个正整数\%s\ after #line is not a positive integer#line 后的“%s”不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ “%s”不能被用作宏名,因为它是C++ 中的一个操作符\%s\ is not a valid filename“%s”不是一个有效的文件名\%s\ is not defined“%s”未定义\%s\ may not appear in macro parameter list“%s不能出现在宏参数列表中\%s\ re-asserted重断言“%s”\%s\ redefined“%s重定义\/*\ within comment“/*出现在注释中\\x used with no following hex digits\\x 后没有16 进制数字\defined\ cannot be used as a macro name“defined不能被用作宏名__COUNTER__ expanded inside directive with -fdirectives-only带-fdirectives-only 时__COUNTER__ 在指示中扩展__V A_ARGS__ can only appear in the expansion of a C99 variadic macro __V A_ARGS__ 只能出现在C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在NFC 中‘%.*s’ is not in NFKC‘%.*s’不在NFKC 中‘##’ cannot appear at either end of a macro expansion‘##’不能出现在宏展开的两端‘#’ is not followed by a macro parameter‘#’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘?’‘:’前没有‘?’‘?’ without following ‘:’‘?’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。
"protocol_type" redefinedprotocol_type重定义anonymous variadic macros were introduced in C99匿名可变参数宏在C99 中被引入assertion without predicate断言后没有谓词assertions are a deprecated extension断言是一个已过时的GCC 扩展assertions are a GCC extension断言是一个GCC 扩展assignment discards qualifiers from pointer target type 赋值时,取消了右值的限定。
assignment from incompatible pointer type不兼容的指针间赋值attempt to use poisoned \%s\试图使用有毒的“%s”backslash and newline separated by space反斜杠和换行为空格所分隔backslash-newline at end of file反斜杠续行出现在文件末尾binary constants are a GCC extension二进制常量是一个GCC 扩展C++ style comments are not allowed in ISO C90C++ 风格的注释在ISO C90 中不被允许cannot find source file %s找不到源文件%sCharacter %x might not be NFKC字符%x 可能不是NFKCcharacter 0x%lx is not in the basic source character set\n字符0x%lx 不在基本源字符集中\ncharacter 0x%lx is not unibyte in execution character set字符0x%lx 在执行字符集中不是单字节的character constant too long for its type字符常量大小超出其类型comma operator in operand of #if#if 操作数中出现逗号comparison between pointer and integerinteger与pointer比较comparison is always false due to limited range of data type由于数据类型范围的限制,比较结果一直为假comparison is always true due to limited range of data type由于数据类型范围的限制,比较结果一直为真。
conversion from %s to %s not supported by iconviconv 不支持从%s 到%s 的转换converting escape sequence to execution character set将转义序列转换到执行字符集converting to execution character set转换到可执行文件的字符集converting UCN to execution character set将UCN 转换到执行字符集converting UCN to source character set将UCN 转换到源字符集could not determine date and time无法决定日期与时间could not determine file timestamp无法决定文件的时间戳CPP arithmetic must be at least as precise as a target intCPP 算术必须至少具有目标int 的精度CPP half-integer narrower than CPP characterCPP 半整数短于CPP 字符CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits在此宿主机上,CPP 不能处理长于%lu 位的宽字符常量,但目标需要%lu 位cppchar_t must be an unsigned typecppchar_t 必须是无符号型current file is older than %s当前文件早于%sdecimal float constants are a GCC extension十进制浮点常量是一个GCC 扩展detected recursion whilst expanding macro \%s\展开宏%s时检测到递归division by zero in #if#if 中用零做除数duplicate macro parameter \%s\重复的宏参数“%s”embedding a directive within macro arguments is not portable将一个指示嵌入宏参数中是不可移植的empty character constant空的字符常量empty filename in #%s#%s 中文件名为空expected expression before 'else'else之前无表达式exponent has no digits指数部分没有数字extra tokens at end of #%s directive#%s 指示的末尾有多余的标识符failure to convert %s to %s无法从%s 转换到%sfixed-point constants are a GCC extension定点常量是一个GCC 扩展浮点常量出现在预处理表达式中function-like macro \%s\ must be used with arguments in traditional C类似函数的宏“%s”在传统C 中必须与参数一起使用hex escape sequence out of range16 进制转义序列越界hexadecimal floating constants require an exponent16 进制浮点常量需要指数部分identifier \%s\ is a special operator name in C++标识符“%s”是C++ 中的一个特殊操作符imaginary constants are a GCC extension虚数常量是一个GCC 扩展imaginary number in preprocessor expression预处理表达式中出现虚数impossible operator ‘%u’不可能的操作‘%u’In _cpp_valid_ucn but not a UCN在_cpp_valid_ucn 中但不是一个UCNincompatible implicit declaration of built-in function 'printf' 与内置的printf函数隐式声明不兼容。