5

这在 Visual Studio 2010 中不起作用,它给了我以下错误

void main (void)
{
     unsigned char* test = "ATGST"; 

}

编辑 1:我的问题是为什么这适用于嵌入式系统,但不适用于 PC?

在此处输入图像描述

但是当我将其更改为:

 char* test = "ATGST";  

有用。

我使用 C 为嵌入式系统编写代码的主要内容,并且我使用 Visual Studio 来测试一些功能,因此我不必在微控制器上实时测试它。

我需要一个解释,因为微控制器接受第一个代码。

4

5 回答 5

12

编辑以符合 C++ 标记的删除并安抚嵌入的标记。

首先,手头的问题是,您试图将char[]文字传递给unsigned char*. 您不能真正将 char 与unsignedor等​​同signed起来,在这方面它有点特别。此外,字符串文字被赋予唯一的存储空间,并且永远不应该被修改。如果您正在处理字符,则需要使用可以衰减到的标准 char*char[]你可以强行施放它,但我不喜欢推荐这样的东西。正如评论之一指出的那样,这样做是安全的。实际上,它实际上是真正安全的稀有事物之一。

但是对于 reinterpret_casting 提供足够的限定条件的严格答案的空间太小了,这基本上是在告诉编译器你知道你在做什么。这可能非常危险,只有在您对手头的问题非常确定时才应该这样做。char 通常只是通用的,甚至没有签名或未签名。由于 unsigned char 的范围比 char 更大,并且通常 char 使用有符号 char 的正子集来描述字符(或任何其他可以适合的数据),如果您的数据不在扩展的正范围内,您重新出发。但是,一定要安全地符合环境和代码。

关于入口点功能 - 符合编辑

由于已经确定您在嵌入式系统上工作,这意味着您的程序很可能不需要返回任何内容,因此它可以保留void main()(也可能是它需要给定嵌入式系统指定的非常不同的返回,OP 最了解他的系统所施加的要求)。在很多情况下,你可以保持 void 的原因是因为没有环境/操作系统可以安抚,没有人可以交流。但是嵌入式系统也可能非常专业,最好通过详细研究给定平台来满足所施加的要求(如果有的话)。

于 2012-06-29T23:05:30.920 回答
5

一方面,你需要一个const在那里。其次,char!=unsigned char和(唯一的) != signed char

字符串字面量是const char[N]适当大小的类型N,因此只能转换为const char*. 请注意,该语言有一个特殊规则,允许您隐式删除,const 但修改字符串文字仍然是 UB,因此这样做是一个非常糟糕的主意。

微控制器的 C 实现在这方面是不合格的。最好简单地使用const char*,这是正确的,而不是试图破解 VS 接受不正确的代码。

于 2012-06-29T23:00:30.670 回答
3

我相信这是将字符串分配给 unsigned char * 的情况。

好吧,当你分配一个字符串值时,它会分配与字符相关的 ASCII 值,所以你应该使用 char * 代替 unsigned char *。

如果您想分配字符串、字符以外的值,那么您的实现是正确的。

希望能帮助到你。

于 2012-07-04T05:29:00.633 回答
0

我的问题是为什么这适用于嵌入式系统,但不适用于 PC?

很可能是因为您不小心在 C++ 中编译 PC 代码,它的类型检查比 C 更严格。在 C 中,无论您使用 unsigned char 还是 plain char,代码都可以编译得很好。

但是,正如其他答案中所建议的那样,您的代码存在一些问题需要修复。如果代码需要同时在嵌入式和 Windows 上运行,则应将其重写为:

#ifdef _WIN32
int main (void)
#else
void main (void)
#endif
{
  const unsigned char* test = "ATGST"; 

}
于 2012-07-02T06:25:41.983 回答
0

如果您对文本使用字符类型,请使用非限定字符。

如果您将字符类型用作数字,请使用无符号字符。unsigned char,它至少为您提供 0 到 255 的范围。

欲了解更多信息:什么是无符号字符?

于 2012-06-29T22:55:12.143 回答