当前位置 博文首页 > t等类型报错_一位初中编程爱好者的博客:VS2019奇怪的编译错误系

    t等类型报错_一位初中编程爱好者的博客:VS2019奇怪的编译错误系

    作者:[db:作者] 时间:2021-08-29 22:30

    最近我写了一个程序,有一个类里面的一个函数声明如下:

    virtual void ProcessInput(const uint8_t* keyState);
    

    这条语句很正常,也没有语法错误,可是VS2019编译怎么也通不过,提示错误如下:

    Component.h(11,41): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    Component.h(11,41): error C2143: 语法错误: 缺少“,”(在“*”的前面)

    这就奇了,编译器报的错和这条语句可谓是八竿子打不着。这也应该是VS2019的bug之一——编译器报错不准。经过分析,我发现了根本问题。
    首先,我们按着CTRL点击uint8_t,发现它的定义在stdint.h中:

    //...
    typedef signed char        int8_t;
    typedef short              int16_t;
    typedef int                int32_t;
    typedef long long          int64_t;
    typedef unsigned char      uint8_t;//就是这一条
    typedef unsigned short     uint16_t;
    typedef unsigned int       uint32_t;
    typedef unsigned long long uint64_t;
    //...
    

    我把那句函数声明中的uint8_t改成unsigned char,编译就能通过了。后来我发现,原来是没包含stdint.h文件。在前面添上一句#include<stdint.h>,编译就能通过了。

    错误提示分析:
    由于我们没有包含头文件,VS编译器不知道怎么就把uint8_t忽略了,于是这条语句就成了virtual void ProcessInput(const * keyState);,编译器认为我忽略了参数类型,所以会报第一条错误。第二条错误的原因也许是编译器认为前面const什么什么是一个参数,后面什么什么*keyState是一个参数,所以提示要有逗号。

    注:这个问题折腾了我好几天,VS竟然不提示包含头文件,提示这么奇怪的错误。估计大多数人都不知道还有stdint.h这个头文件,更没有人会想到用一个类型别名就需要包含这个不常见的头文件。关键是,VS的代码分析系统竟然没发现这个错误,编译时却一直报错,实在很坑人。建议VS改进编译错误信息,让开发者能更快找出错误。

    cs