为什么我不能声明unsigned char * test =“Some text”

时间:2012-06-29 22:52:38

标签: c visual-studio-2010 embedded

这在visual studio 2010中不起作用,它给我以下错误

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

}

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

enter image description here

但是当我改为:

 char* test = "ATGST";  

它有效。

我使用C编写嵌入式系统代码的主要内容,我使用visual studio来测试某些功能,因此我不必在Micro-controller上实时测试它。

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

5 个答案:

答案 0 :(得分:10)

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

首先,问题在于您尝试将char[]字面值传递给unsigned char*。你无法将char与unsignedsigned等同起来,在这方面有点特别。此外,字符串文字具有唯一存储空间,不应修改。如果您正在处理字符,则需要使用char*可以衰减的标准 char[]。你可以强行施放它,但我不喜欢推荐这样的东西。正如其中一条评论所指出的那样,这样做是安全的。实际上,它实际上是一种非常罕见的东西,实际上是一个安全的明智之举。

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

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

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

答案 1 :(得分:5)

首先,你需要一个const。其次,char!= unsigned char,以及(唯一)!= signed char

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

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

答案 2 :(得分:3)

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

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

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

希望它有所帮助。

答案 3 :(得分:0)

如果您使用文字的字符类型,请使用不合格的字符。

如果您使用字符类型作为数字,请使用unsigned char。 unsigned char,它给你至少0到255的范围。

了解更多信息:What is an unsigned char?

答案 4 :(得分:0)

  

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

很可能是因为你不小心用C ++编译了比C更严格的PC代码。在C中,无论你使用unsigned char还是普通char都没关系,代码编译就好了。 / p>

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

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

}