ハードコーディングされたchar配列を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);
だから、質問:
hardcoded配列を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;
}
UPDATE:これは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
にキャストしないと、ナローイング変換は拒否されます。文字列をパラメータとして送信するだけです。うまくコンパイルできるようです。
#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));
このコードは、「マジックナンバー」が含まれていないため、最も保守しやすいコードであり、複合リテラルバージョンのように、不足している配列項目や配列外のバグは含まれていません。
このコードは、C++およびC90とも互換性があります。
ここで最も重要なことは、生成されたマシンコードがいずれにしても同じであることを認識することです。複合リテラルを使用して何らかの形の最適化を行っているとは思わないでください。
複合リテラル を使用できます。
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;
}