首页 文章

为什么编译器看到char *和printf 's conversion specifier “s” when the char * is typedef' d之间的不匹配并通过结构访问?

提问于
浏览
4

为什么编译器会在下面的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 回答

  • 0

    在作为这个问题的评论的回声室中,似乎那些参与者和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的人是能够犯错误的人,而这个错误信息是其中一个错误的表现,我们通常称之为“错误”,“故障”或“软件错误”的症状 .

相关问题