当char *是typedef并通过struct访问时,为什么编译器会在char *和printf的转换说明符“s”之间看到不匹配?

为什么编译器会在下面的printf中抱怨参数类型“char”和转换说明符“s”不匹配?

#include  #include  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  #include  //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);

  • 逐字错误消息:参数类型“char”和转换说明符“s”不匹配。

  • 进一步测试显示ms.str确实是预期类型char *(例如,正确的sizeof,交换转换说明符为“c”表示char,如错误消息所示,如果printf指向char的指针,则会出现乱码一个炭,等)

  • 更改typedef标识符的名称(例如,从STR到STR_TEST)会导致相同的错误。 因此,标准标题中的定义似乎没有冲突。

在作为这个问题的评论的回声室中,似乎那些参与者和OP已经达成共识,这是NetBeans的错误。

我无法在Cygwin x64上重现您的问题。 此外,“不匹配参数类型”char“和转换说明符”s“”看起来不像GCC警告,可能是Netbeans问题。 另见这个类似的Netbeans错误报告 – 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的人是能够犯错误的人,而这个错误信息是其中一个错误的表现,我们通常称之为“错误”,“故障”或“软件错误”的症状。