这在visual studio 2010中不起作用,它给我以下错误
void main (void)
{
unsigned char* test = "ATGST";
}
编辑1:我的问题是为什么这适用于嵌入式系统,但在PC上不起作用?
但是当我改为:
char* test = "ATGST";
它有效。
我使用C编写嵌入式系统代码的主要内容,我使用visual studio来测试某些功能,因此我不必在Micro-controller上实时测试它。
我需要一个解释,因为微控制器接受第一个代码。
答案 0 :(得分:10)
编辑以符合删除C ++标记并安抚嵌入式标记。
首先,问题在于您尝试将char[]
字面值传递给unsigned char*
。你无法将char与unsigned
或signed
等同起来,在这方面有点特别。此外,字符串文字具有唯一存储空间,不应修改。如果您正在处理字符,则需要使用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";
}