그래서 노동 조합은 다음과 같이 정의했다 :GCC는 투명 조합
typedef union
{
uint8_t *b1;
uint16_t *b2;
uint32_t *b3;
uint64_t *b4;
} buffer_u __attribute__((__transparent_union__));
그리고 기능은 다음과 같이 정의 :
uint8_t buffer[1024];
write_long_long_to_buffer(buffer, 1024, some_value);
컴파일러 :
int write_byte_to_buffer(buffer_u buf, uint16_t length, uint8_t val);
int write_short_to_buffer(buffer_u buf, uint16_t length, uint16_t val);
int write_int_to_buffer(buffer_u buf, uint16_t length, uint32_t val);
int write_long_long_to_buffer(buffer_u buf, uint16_t length, uint64_t val);
그런 다음 내가 좋아 호출하고 다음 오류가 발생합니다.
error: conversion from ‘uint8_t*’ to non-scalar type ‘buffer_u’ requested
왜이 오류가 발생합니까? 나는 유니온 멤버 타입이 buffer_u가 예상되는 곳에서 전달 될 수 있기를 기대하기 때문에 transparent_union 속성을 잘못 읽고 있어야합니다.
버퍼 유형 또는 각 함수의 다른 포인터 유형에 void *를 사용하지 않으려 고하고 있지만 다시 되돌려 야 할 수도 있습니다.
유용한 정보가 하나 더 있습니다. 코드는 C이지만 라이브러리를 사용하는 코드는 C++입니다.
C++에 대한 특별한 무언가가 허용되지 않습니까?
GCC 버전 4.4.7 유일한 플래그를 컴파일 :
난 당신이 노조가 가득되는 데이터를 지정하는 플래그를 사용, 더 나은 연습, 또한, 모든 타입 변환해야합니다 생각 이 시점에서 -Wall -Werror입니다. 다양한 크기의 데이터로 채워야하는 버퍼가 있습니다. 이 버퍼는 때때로 다른 크기 (8 바이트의 배수가 아님) 일 수 있으므로 uint8_t buf [xxx]가 사용됩니다. 또한 긴 긴 글씨는 단지 예일뿐입니다. 다른 것들도 잘 사용될 것입니다. 지금 내 호출은 일부 단위 테스트에 불과하며 나머지 응용 프로그램을 만들지 않았습니다. – Matt
당신이 시도한대로 컴파일되고 실행됩니다. – Matt
분명히 그것은 g ++가 당신을 좋아하지 않기 때문에 C++과 무언가입니다. 이 코드는 제가 작업중인 라이브러리의 일부입니다.라이브러리는 C로 작성되었지만 내가 작성한 단위 테스트는 C++ 프레임 워크를 사용합니다 (따라서 g ++를 사용합니다). – Matt