为什么编译器会在下面的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);
}
笔记:
-
System = 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);
-
Verbatim错误消息:参数类型“char”和转换说明符“s”不匹配 .
-
进一步的测试显示,ms.str确实是预期类型char *(例如,正确的sizeof,交换转换说明符为“c”表示char,如错误消息所示,如果printf指向char,则会出现乱码作为char等)
-
更改typedef标识符的名称(例如,从STR到STR_TEST)会导致相同的错误 . 因此,标准 Headers 中的定义似乎没有冲突 .
1 回答
在作为这个问题的评论的回声室中,似乎那些参与者和OP已经达成共识,这是NetBeans的错误 .
......所以你的问题需要纠正:
编写NetBeans的人是能够犯错误的人,而这个错误信息是其中一个错误的表现,我们通常称之为“错误”,“故障”或“软件错误”的症状 .