错误发生在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*
类型还有其他好处:
const char*
类型提供了一种标准的约定,使代码更易读、易理解,因为其他开发人员可以清楚地知道这是一个字符串常量。所以,当传递字符串常量给函数时,通常会使用const char*
类型作为参数类型,以正确地反映字符串常量的特性和约束。
const
关键字在C语言中用于声明常量(constant)。它可以应用于不同的位置和不同的类型,具有以下作用:
修饰变量:使用const
关键字修饰变量,表示该变量的值不可被修改。例如:
const int num = 10; // 声明一个常量num,并指定初始值为10
修饰函数参数:使用const
关键字修饰函数的参数,表示在函数内部不会修改该参数的值。这可以用来确保函数不会意外地修改调用者传递的数据。例如:
void printString(const char* str); // 声明一个函数,参数str是不可修改的字符串指针
修饰函数返回值:使用const
关键字修饰函数的返回值,表示该返回值是一个常量(不可被修改)。这可以用来限制函数返回的值的使用方式。例如:
const int getValue(); // 声明一个函数,返回值是一个常量整数
修饰指针:使用const
关键字修饰指针,表示指针指向的数据不可被修改。有两种情况:
const
指针:指针本身是可修改的,但是指向的数据是不可修改的。例如:const int* ptr; // ptr是一个指向常量整数的指针,ptr本身是可修改的
const
的指针(常量指针):指针本身是不可修改的,指向的数据也是不可修改的。例如:int value = 10;
const int* constPtr = &value; // constPtr是一个常量指针,指向一个常量整数
总之,const
关键字用于声明常量,限制变量、函数参数、函数返回值和指针的修改行为,提高代码的安全性、可读性和可靠性。它是一种编程技术,用于强制保证代码中的数据不会被无意识地修改。