C语言 “illegal type conversion”(非法类型转换)的错误,(利用串口发送字符串时发生的)

发布时间:2023年12月26日

错误发生在BSP_Init.c文件的第78行,出现了“illegal type conversion”(非法类型转换)的错误。
代码如下:

void Putchar(uint8_t data)
{
    while(!TRMT);       // 发送寄存器为空
    TXB = data;         // 发送数据
    CLRWDT();           // 喂狗
}

void SendString(unsigned char *p)
{
    while(*p != '\0')
    {
        CLRWDT();       // 喂狗
        Putchar(*p);
        p++;
    }
}

int main()
{
    SendString("Hello");
    return 0;
}


根据详细信息可以看出,错误可能是由于一个非法的类型转换导致的。

然后修改为正确代码:

根据您提供的代码,我注意到一个潜在的问题,可能导致您收到编译错误。

在您的代码中,您使用了SendString("Hello")来调用SendString函数并传递一个字符串常量作为参数。然而,在C语言中,字符串常量默认是const char*指针类型,而不是unsigned char*类型。

因此,您的函数声明中,将unsigned char*类型参数改为const char*类型将是更好的选择。这将消除类型转换的错误。

修正后的代码如下:

void Putchar(uint8_t data)
{
    while(!TRMT);       // 发送寄存器为空
    TXB = data;         // 发送数据
    CLRWDT();           // 喂狗
}

void SendString(const char *p)
{
    while(*p != '\0')
    {
        CLRWDT();       // 喂狗
        Putchar((uint8_t)*p);
        p++;
    }
}

int main()
{
    SendString("Hello");
    return 0;
}

请注意,我们在Putchar函数的调用中进行了类型转换,将char类型参数转换为uint8_t类型,以符合函数定义中的参数类型。

知识点:

在C语言中,字符串常量是不可变的(immutable)。使用const char*类型来声明字符串常量可以提醒编译器和其他开发人员,表明这是一个只读的字符指针,以防止对字符串常量进行不应该的修改。这有助于确保代码的安全性和可靠性。

使用const char*类型还有其他好处:

  • 编译器可以在编译时检查对字符串常量的修改操作,并发出警告或错误,以提供更好的代码质量控制。
  • 在一些编译器中,将字符串常量存储在只读内存段(如.text段)中,这使得字符串常量更加安全,防止意外修改。
  • const char*类型提供了一种标准的约定,使代码更易读、易理解,因为其他开发人员可以清楚地知道这是一个字符串常量。

所以,当传递字符串常量给函数时,通常会使用const char*类型作为参数类型,以正确地反映字符串常量的特性和约束。

const关键字的作用

const关键字在C语言中用于声明常量(constant)。它可以应用于不同的位置和不同的类型,具有以下作用:

  1. 修饰变量:使用const关键字修饰变量,表示该变量的值不可被修改。例如:

    const int num = 10; // 声明一个常量num,并指定初始值为10
    
  2. 修饰函数参数:使用const关键字修饰函数的参数,表示在函数内部不会修改该参数的值。这可以用来确保函数不会意外地修改调用者传递的数据。例如:

    void printString(const char* str); // 声明一个函数,参数str是不可修改的字符串指针
    
  3. 修饰函数返回值:使用const关键字修饰函数的返回值,表示该返回值是一个常量(不可被修改)。这可以用来限制函数返回的值的使用方式。例如:

    const int getValue(); // 声明一个函数,返回值是一个常量整数
    
  4. 修饰指针:使用const关键字修饰指针,表示指针指向的数据不可被修改。有两种情况:

    • const指针:指针本身是可修改的,但是指向的数据是不可修改的。例如:
      const int* ptr; // ptr是一个指向常量整数的指针,ptr本身是可修改的
      
    • 指向const的指针(常量指针):指针本身是不可修改的,指向的数据也是不可修改的。例如:
      int value = 10;
      const int* constPtr = &value; // constPtr是一个常量指针,指向一个常量整数
      

总之,const关键字用于声明常量,限制变量、函数参数、函数返回值和指针的修改行为,提高代码的安全性、可读性和可靠性。它是一种编程技术,用于强制保证代码中的数据不会被无意识地修改。

文章来源:https://blog.csdn.net/weixin_51624736/article/details/135228020
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。