2016-08-31 11 views
4

초기화시 변수를 암시 적으로 선언 할 수 있습니까? 아마도 그래서 같은 : (눈에)C에서 암시 적으로 "인스턴스화 선언"?

struct S 
{ 
    void *a; 
    void *b; 
}; 

struct S test = {&(int), &(float) }; 

void testfunc (void) 
{ 
    *(test.a) = -2; 
    *(test.b) = 1.3; 
} 

장점 :

  • 암시 적 변수는 구조체, 아니 외부 액세스에 보호를받습니다 명시 적 선언에 필요한

    1. 추가 라인.
  • +6

    아니, 그렇게 할 수는 없습니다. 물론 메모리를 동적으로 할당하지 않는 한. 또한 캐스팅하지 않고'void *'를 참조 할 수 없습니다. –

    +6

    아니요, 불가능합니다. –

    +1

    더 중요한 것은 의미가 없다는 것입니다. 예, void 포인터가 복합 리터럴을 가리 키도록 설정할 수 있지만 구조체에는 형식 정보가 없으므로 아무 것도 얻을 수 없습니다. 당신이 해결하려고하는 실제 문제는 무엇입니까? 당신의 두 가지 소위 "이점"은 말도 안되고 사실이 아닙니다. _opaque types_을 보길 원할 것입니다. – Lundin

    답변

    1

    아니요, 불가능합니다. 주소 연산자는 인수로 실제 존재하는 기호를 요구합니다.

    C11 초안 메시지 :

    단항 & 연산자의 피연산자 인 객체를 지정하는 기능 지정자하는 [] 또는 단항 * 연산자의 결과 또는 좌변 중한다 비트 필드가 아니며 register 저장소 클래스 지정자로 선언되지 않았습니다.

    5

    예 C99부터 가능합니다. 당신의 추측은 아주 가깝습니다. 나중에 다른 값을 지정하려는 경우에도하지만이 보강 초기화를 제공해야합니다 :

    struct S test = { &(int){0}, &(float){0} }; 
    

    이 기능은 compound literal이라고합니다. 복합 리터럴은 lvalue입니다.

    testfunc에는 오류가 있습니다. avoid * 유형이므로 *(test.a)을 쓸 수 없습니다. Sint *a; float *b; (으)로 변경하거나 작성 시점에서 전송해야합니다. 예 : *(int *)test.a = 5;.

    +0

    복합 리터럴 값은 수정할 수 없습니다. OP는 실행 중에 참조 해제 된 값을 변경하려고합니다. – LPs

    +2

    @LP : 표준은 예제를 제공합니다 (표준이 아니지만 지시적입니다) : _ 다음 세 표현식은 다른 의미를 갖습니다 : _/"/ tmp/fileXXXXXX" '- '(const char []) { "/ tmp/fileXXXXXX"}'- _ 첫 번째는 항상 정적 저장 기간을 가지며 타입 배열이'char'이지만 수정할 필요는 없습니다. 마지막으로 두 개는 함수 본문에서 자동 저장 기간을 가지며이 중 두 개가 수정 가능합니다. _ 'const'로 한정된 복합 리터럴에 대한 설명도 있습니다. 이는 복합 리터럴을 수정할 수 있음을 명확하게 나타냅니다. –

    +0

    @JonathanLeffler 감사합니다. 매우 흥미로운. – LPs

    관련 문제