我如何在 c++ 中 memcpy() 一个常量,例如我已经使用定义了一个常量
#define constant1 0x0080
当我想
memcpy(&some_memory_block, constatnt1, 2 );
它说
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
我如何在 c++ 中 memcpy() 一个常量,例如我已经使用定义了一个常量
#define constant1 0x0080
当我想
memcpy(&some_memory_block, constatnt1, 2 );
它说
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
您可以尝试使用常量,而不是预编译器定义。
const unsigned short int constant1 = 0x0080;
memcpy(&some_memory_block, &constant1, 2 );
你的常量(宏)实际上只是一个字面量。因此,它没有地址可以作为参数memcpy
或另一个需要内存位置的函数给出。如果您想这样做,您需要有一个实常数(例如const int
),如其他答案中所建议的那样。
与宏相反的实常数(在这种情况下只是文本替换,在这种情况下用于文字)通常在功能上与文字相同,只要您不获取它的地址。但是,可以获取它的地址,此时它的行为就像一个“正常”变量。这意味着您可以memcpy
在其地址上使用。
然而,通常“更正确”的答案是:根本不要做这种事情。如果某些东西是常数,则不应复制它(当然存在例外,但通常您不应该这样做)。唯一有效的原因是您想要一个常量值来初始化一个非常量变量,但是分配它比分配它要容易得多memcpy
。
否则复制一个常量只会增加冗余,消耗额外的内存而无益,增加缓存压力,并破坏许多编译器优化。例如,如果编译器知道符号是常量,则编译器可以对表达式进行简单的优化(当然,也会评估更复杂且不太明显的表达式)a = b + c - c + b
。a = computed_value_of_2b
但是,当给定一些内存位置时,编译器必须发出在运行时评估的代码,它别无选择。
在您的情况下发生的情况是,当您编译代码时,constant1 被替换为 0x0080。而这条线
memcpy(&some_memory_block, constatnt1, 2 );
变成
memcpy(&some_memory_block, 0x0080, 2 );
如果
你查看memcpy,你会看到 memcpy 需要一个指针来指向第二个参数。
你必须分配一个指向 memcpy 的指针
const int constant1 = 0x0000;
memcpy(&some_memory_block, &constant1 , 2 );