2013-06-12 2 views
0

그래서 노동 조합은 다음과 같이 정의했다 :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++에 대한 특별한 무언가가 허용되지 않습니까?

답변

1

글쎄, 우리가 알 수 있듯이, G ++는 __transparent_union__을 지원하지 않습니다.

struct s_buffer_u 
{ 
    enum e_pointer_width { width8, width16, width32, width64 } width; 
    union 
    { 
     uint8_t *b1; 
     uint16_t *b2; 
     uint32_t *b3; 
     uint64_t *b4; 
    } buffer_u_internal; 
} 
typedef struct s_buffer_u _buffer_u; 
0

메이트,이 코드는 나를 위해 일한 :

#include <stdint.h> 

typedef union 
{ 
    uint8_t *b1; 
    uint16_t *b2; 
    uint32_t *b3; 
    uint64_t *b4; 
} buffer_u __attribute__((__transparent_union__)); 

int write_byte_to_buffer(buffer_u buf, uint16_t length, uint8_t val) {return 0;} 
int write_short_to_buffer(buffer_u buf, uint16_t length, uint16_t val) {return 0;} 
int write_int_to_buffer(buffer_u buf, uint16_t length, uint32_t val) {return 0;} 
int write_long_long_to_buffer(buffer_u buf, uint16_t length, uint64_t val) {return 0;} 

int main (int argc, char *argv[]) 
{ 
    uint8_t p[100]; 
    write_byte_to_buffer(p, 1, 100); 

    return 0; 
} 

GCC 버전 : fanl @ 우분투 - StiDesktop : ~ $ gcc를 --version GCC (/ 리나 4.6.3-1ubuntu5 우분투) 4.6.3 저작권 (C) 2011 자유 소프트웨어 재단 이것은 무료 소프트웨어입니다. 복사 조건에 대한 소스를 참조하십시오. 아무런 보증이 없습니다; 상품성 또는 특정 목적에의 적합성을 보장하지 않습니다.

아마 write_long_long_to_buffer을 구현 한 것일 수 있습니다. 왜 long_long 함수에 char 포인터를 전달합니까?

GCC 버전 및 컴파일 플래그는 무엇입니까?

+0

GCC 버전 4.4.7 유일한 플래그를 컴파일 :

난 당신이 노조가 가득되는 데이터를 지정하는 플래그를 사용, 더 나은 연습, 또한, 모든 타입 변환해야합니다 생각 이 시점에서 -Wall -Werror입니다. 다양한 크기의 데이터로 채워야하는 버퍼가 있습니다. 이 버퍼는 때때로 다른 크기 (8 바이트의 배수가 아님) 일 수 있으므로 uint8_t buf [xxx]가 사용됩니다. 또한 긴 긴 글씨는 단지 예일뿐입니다. 다른 것들도 잘 사용될 것입니다. 지금 내 호출은 일부 단위 테스트에 불과하며 나머지 응용 프로그램을 만들지 않았습니다. – Matt

+0

당신이 시도한대로 컴파일되고 실행됩니다. – Matt

+0

분명히 그것은 g ++가 당신을 좋아하지 않기 때문에 C++과 무언가입니다. 이 코드는 제가 작업중인 라이브러리의 일부입니다.라이브러리는 C로 작성되었지만 내가 작성한 단위 테스트는 C++ 프레임 워크를 사용합니다 (따라서 g ++를 사용합니다). – Matt

1

g ++은 분명히 __transparent_union__ 속성에 신경 쓰지 않습니다. 그것은 똑바로 C 응용 프로그램을 컴파일하면 잘 작동하지만 g ++ 사용할 때 문제가 있습니다

+0

기본적으로 GNU C 확장은 C++에서 지원되지 않는다고 가정해야합니다 (실제로 C++ 인 경우 제외). –