为什么编译器会抱怨以下 printf 中的参数类型“char”和转换说明符“s”不匹配?
#include <stdio.h>
#include <stdlib.h>
typedef char * STR; // causes problems in printf below
int main(void) {
struct MyStruct {
STR str;
};
struct MyStruct ms = {"some text"};
printf("%s\n", ms.str);
return (EXIT_SUCCESS);
}
当删除 typedef 时,编译器不会抱怨相同的代码:
#include <stdio.h>
#include <stdlib.h>
//typedef char * STR; // runs fine without typedef
int main(void) {
struct MyStruct {
char * str; //STR str;
};
struct MyStruct ms = {"some text"};
printf("%s\n", ms.str);
return (EXIT_SUCCESS);
}
Notes:
系统 = Win 64、NetBeans IDE 8.2、GCC 编译器,无论使用 Cygwin 还是 MinGW 工具,或者无论是 32 位还是 64 位,都没有差异。
如果我避免使用 struct 或 typedef,则会消除错误。但只要同时使用 typedef 和 struct 就会出现错误,如图所示。
-
在发布之前,我检查了(除其他外)stackoverflow.com/questions/20944784/,其中建议使用 const。但是,无论 typedef 是否为,错误仍然存在
指向常量 char 的指针 (typedef char const * STR);
指向 char 的常量指针 (typedef char * const STR);或者
指向常量 char 的常量指针 (typedef char const * const STR);
逐字错误消息:参数类型“char”和转换说明符“s”不匹配。
进一步测试表明 ms.str 确实是预期的 char * 类型(例如,正确的 sizeof、将 char 的转换说明符交换为“c”(如错误消息所示),如果 printf'ing 指向 char 的指针为一个字符等)
更改 typedef 标识符的名称(例如,从 STR 更改为 STR_TEST)会导致相同的错误。所以看起来与标准头文件中的定义没有冲突。
在这个问题的评论回声中,这些参与者和 OP 似乎已经达成共识,认为这是 NetBeans 的错。
我无法在 Cygwin x64 上重现您的问题。此外,“参数类型“char”和转换说明符“s”不匹配”看起来不像 GCC 警告,可能是 Netbeans 问题。也可以看看这个类似的 Netbeans 错误报告 https://netbeans.org/bugzilla/show_bug.cgi?id=258511– RustyX 5 月 26 日 18:51
@BloodyPeasant gcc 没有错误消息说“参数类型“char”和转换说明符“s”不匹配”。 ,可能是 NetBeans 显示错误消息而不是 gcc,在这种情况下 NetBeans 是错误的,并且错误消息中的英语语法也很差。 – 5 月 26 日 19:33
@nos Ha,如此糟糕的语法是一个明显的迹象,表明这是一个 NetBeans 问题...在 NetBeans 的引擎盖下查看,看来您和 RustyX 是正确的,这只是一个 IDE 故障。谢谢大家。 – 血腥农民 5 月 27 日 2:01
...所以你的问题需要更正:
为什么编译器[NetBeans]抱怨以下 printf 中的参数类型“char”和转换说明符“s”不匹配?
编写 NetBeans 的人都是容易犯错误的人,而此错误消息就是这些错误之一的表现,即我们通常所说的“错误”、“故障”或“软件故障”的症状。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)