C 硬编码数组作为 memcpy 参数
C hardcoded array as memcpy parameter
我想将硬编码的字符数组作为 source
参数传递给 memcpy ... 类似这样的内容:
memcpy(dest, {0xE3,0x83,0xA2,0xA4,0xCB} ,5);
使用 clang 编译出现以下错误:
cccc.c:28:14: error: expected expression
如果我将其修改为(见额外的括号):
memcpy(dest,({0xAB,0x13,0xF9,0x93,0xB5}),5);
clang给出的错误是:
cccc.c:26:14: warning: incompatible integer to pointer
conversion passing 'int' to parameter of
type 'const void *' [-Wint-conversion]
cccc.c:28:40: error: expected ';' after expression
memcpy(c+110,({0xAB,0x13,0xF9,0x93,0xB5}),5);
所以,问题:
如何传入 硬编码 数组作为 memcpy
(http://www.cplusplus.com/reference/cstring/memcpy/)
的源参数
我试过:
(void*)(&{0xAB,0x13,0xF9,0x93,0xB5}[0]) - syntax error
{0xAB,0x13,0xF9,0x93,0xB5} - syntax error
({0xAB,0x13,0xF9,0x93,0xB5}) - see above
(char[])({0xE3,0x83,0xA2,0xA4,0xCB}) - error: cast to incomplete type 'char []' (clang)
还有一些更疯狂的组合我很惭愧写在这里...
请记住:我不想创建一个新变量来保存数组。
如果你使用C99或更高版本,你可以使用复合文字。 (N1256 6.5.2.5)
#include <stdio.h>
#include <string.h>
int main(void){
char dest[5] = {0};
memcpy(dest, (char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);
for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
putchar('\n');
return 0;
}
更新: 这适用于 GCC 上的 C++03 和 C++11,但被 -pedantic-errors
选项拒绝。这意味着这不是标准 C++ 的有效解决方案。
#include <cstdio>
#include <cstring>
int main(void){
char dest[5] = {0};
memcpy(dest, (const char[]){(char)0xE3,(char)0x83,(char)0xA2,(char)0xA4,(char)0xCB} ,5);
for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
putchar('\n');
return 0;
}
分是:
- 使数组常量,否则获取临时数组的地址将被拒绝。
- 将数字显式转换为
char
,否则缩小转换将被拒绝。
您可以使用 Compound Literals.
int main()
{
unsigned char dest[5];
size_t i;
memcpy(dest, (unsigned char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);
printf("Test: " );
for(i=0; i<sizeof(dest)/sizeof(dest[0]); i++)
printf("%02X - ", dest[i] );
printf("\n");
return 0;
}
您可以只发送一个字符串作为参数。似乎编译得很好。
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char dest[6] = {0};
memcpy(dest,"\XAB\x13\XF9\X93\XB5", 5);
return 0;
}
最好的解决办法是根本不这样做,而是使用一个临时变量:
const char src[] = {0xE3,0x83,0xA2,0xA4,0xCB};
memcpy(dest, src, sizeof(src));
这段代码是最可维护的,因为它不包含 "magic numbers",所以它不会包含任何丢失的数组项或数组越界错误,就像复合文字版本那样。
此代码还与 C++ 和 C90 兼容。
这里最重要的是要意识到生成的机器代码无论如何都是相同的。不要认为您正在通过使用复合文字进行任何形式的优化。
我想将硬编码的字符数组作为 source
参数传递给 memcpy ... 类似这样的内容:
memcpy(dest, {0xE3,0x83,0xA2,0xA4,0xCB} ,5);
使用 clang 编译出现以下错误:
cccc.c:28:14: error: expected expression
如果我将其修改为(见额外的括号):
memcpy(dest,({0xAB,0x13,0xF9,0x93,0xB5}),5);
clang给出的错误是:
cccc.c:26:14: warning: incompatible integer to pointer
conversion passing 'int' to parameter of
type 'const void *' [-Wint-conversion]
cccc.c:28:40: error: expected ';' after expression
memcpy(c+110,({0xAB,0x13,0xF9,0x93,0xB5}),5);
所以,问题:
如何传入 硬编码 数组作为 memcpy
(http://www.cplusplus.com/reference/cstring/memcpy/)
我试过:
(void*)(&{0xAB,0x13,0xF9,0x93,0xB5}[0]) - syntax error
{0xAB,0x13,0xF9,0x93,0xB5} - syntax error
({0xAB,0x13,0xF9,0x93,0xB5}) - see above
(char[])({0xE3,0x83,0xA2,0xA4,0xCB}) - error: cast to incomplete type 'char []' (clang)
还有一些更疯狂的组合我很惭愧写在这里...
请记住:我不想创建一个新变量来保存数组。
如果你使用C99或更高版本,你可以使用复合文字。 (N1256 6.5.2.5)
#include <stdio.h>
#include <string.h>
int main(void){
char dest[5] = {0};
memcpy(dest, (char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);
for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
putchar('\n');
return 0;
}
更新: 这适用于 GCC 上的 C++03 和 C++11,但被 -pedantic-errors
选项拒绝。这意味着这不是标准 C++ 的有效解决方案。
#include <cstdio>
#include <cstring>
int main(void){
char dest[5] = {0};
memcpy(dest, (const char[]){(char)0xE3,(char)0x83,(char)0xA2,(char)0xA4,(char)0xCB} ,5);
for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]);
putchar('\n');
return 0;
}
分是:
- 使数组常量,否则获取临时数组的地址将被拒绝。
- 将数字显式转换为
char
,否则缩小转换将被拒绝。
您可以使用 Compound Literals.
int main()
{
unsigned char dest[5];
size_t i;
memcpy(dest, (unsigned char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5);
printf("Test: " );
for(i=0; i<sizeof(dest)/sizeof(dest[0]); i++)
printf("%02X - ", dest[i] );
printf("\n");
return 0;
}
您可以只发送一个字符串作为参数。似乎编译得很好。
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char dest[6] = {0};
memcpy(dest,"\XAB\x13\XF9\X93\XB5", 5);
return 0;
}
最好的解决办法是根本不这样做,而是使用一个临时变量:
const char src[] = {0xE3,0x83,0xA2,0xA4,0xCB};
memcpy(dest, src, sizeof(src));
这段代码是最可维护的,因为它不包含 "magic numbers",所以它不会包含任何丢失的数组项或数组越界错误,就像复合文字版本那样。
此代码还与 C++ 和 C90 兼容。
这里最重要的是要意识到生成的机器代码无论如何都是相同的。不要认为您正在通过使用复合文字进行任何形式的优化。