2014-12-12 2 views
0

조건부 구문 내부에서 구조체 변수를 전체적으로 평가하여 각 요소를 쓸 필요가없는 방법이 있습니까? 예를 들어 다음과 같은 구조체를 제공 :C에서 조건문 내부의 구조체 계산

typdef struct 
{ 
    int a; 
    int b; 
    int c; 
} number; 

number foo = {1, 2, 3}; 
내가의 요소를 평가하고자

if 문 같은 경우 :

if (foo.a == 1 && foo.b == 2 && foo.c == 3) 
{ 
    ... 
} 

그러나, 나는 개별 요소를 나열 할 필요없이 전체 구조체를 평가할 . 이것이 올바르지 않다는 것을 알고 있지만 이것은 내가 성취하고자하는 바를 따르고 있습니다.

if (foo == {1, 2, 3}) 
{ 
    ... 
} 

귀하의 도움을 크게 받으실 수 있습니다. 감사.

답변

3

당신은

(number) { 1, 2, 3 } 

그래서 좀 더 논리적 인 시도가

if (foo == (number) { 1, 2, 3 }) 
    ... 

로 보일 것이다 리터럴 화합물을 통해 임시 구조체를 나타낼 수 있지만, C 언어는 제공하지 않기 때문에 그것은 작동하지 않습니다 struct 객체를 비교하기위한 내장 연산자. 당신 때문에 패딩의 내용을 예측 할 수없는 상태로 memcmp 대신

if (memcmp(&foo, &(number) { 1, 2, 3 }, sizeof foo) == 0) 
    ... 

하지만 불행히도,이 작동하도록 보장되지 않으므로 사용할 수 있습니다하면 구조체의 객체가 그 안에있을 수 있습니다 바이트.

if (is_same_number(&foo, &(number) { 1, 2, 3 })) 
    ... 
+0

와우, 이제 당신이 내 마음을 읽고 있다고 생각합니다. 그러나 패딩은 구현체에 의해 정의되지만 동일한 구조체의 인스턴스 간에는 변경되지 않습니다. 편집 : 스크래치, 내가 잘못 읽었습니다. – Quentin

+0

도움 주셔서 감사합니다 Andrey. 구조체는 "__attribute __ ((__ packed__))"을 통해 압축됩니다. 그렇다면 복합 리터럴이 memcmp에서 사용하기 위해 압축 된 속성을 따르는 것을 어떻게 보장 할 수 있습니까? – void

+0

@quant : 모든 컴파일러에서 속성은 struct * type *에 적용되며 특정 객체에는 적용되지 않습니다. 이렇게하면 복합체 리터럴을 통해 생성 된 것을 포함하여 해당 구조체 유형의 모든 * 객체가 동일하게 패킹되고 팩됩니다. – AnT

0

struct가 필요하지만 unsigned char *로 변환하거나 0x000000010002가 3 개의 정수 {0 1 2}를 나타내는 리터럴의 형식이되는 리터럴을 사용하는 것은 확실하지 않습니다.

endianess와 관련된 문제를 방지하려면 런타임시 정수로 값을 선언하기 만하면 표현이 시스템 엔디안과 일치합니다.

런타임 정의가 허용되지 않은 경우 매크로를 사용할 수도 있습니다.

나는 memcpy를 낭비하지 않을 것입니다.

+0

엔디안이 작동 할 수있는 즐거움이 될 것입니다

이 경우 최선의 조치는 비교 함수를 수동으로

inline bool is_same_number(const number *lhs, const number *rhs) { return lhs->a == rhs->a && lhs->b == rhs->b && lhs->c == rhs->c; } 

를 작성하고 다음 화합물 문자 기능과 함께 사용 할 수 있습니다 with ... – Quentin

+0

개념이 사라질 때까지 항상 있었고 항상있을 것입니다 :-D – Jay