2010-08-10 7 views
0

을 입력하면 다음 매크로 offsetof이 있습니다. 아무도 그것이 무엇을하는지 말해 줄 수 있습니까?다음 매크로는 무엇을 수행합니까? qemu 소스 코드에서

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER) 

그것은 이러한 방식으로 사용되는 : CPUState이 구조체이다

offsetof(CPUState, icount_decr.u32) 

.

구조체 내부의 멤버 오프셋을 제공한다고 생각하지만 확실하지 않습니다.

편집 : 그래, 무슨 일이 일어 났는지 알아 냈어. CPUState의 정의에는 icount_decr 변수가 포함 된 매크로가 있습니다.

+1

http://en.wikipedia.org/wiki/Offsetof –

+1

매크로는 기술적으로 정의되지 않은 동작을 트리거하지만 많은 곳에서 작동합니다. 현대적인 (예 : GCC 4)''은 컴파일러가 정의되지 않은 것을 피하기 위해 컴파일러에 정의 할 것이며 C++의 두통을 피할 것입니다. – zwol

+0

@Zack : 대답에 대해 말했듯이, 그것은 라이브러리 기능이기 때문에, 정의되지 않은 동작이 아닙니다. 구현은 원하는대로 구현할 수 있습니다. (본질적으로,이 특정 구현은 역 참조 된 널 포인터의 주소를 특정 컴파일러에 맞게 잘 정의해야합니다.) – GManNickG

답변

1

귀하의 생각은 맞습니다! 그리고 매크로의 이름도 좋은 힌트를줍니다. ;)

3

구조체의 멤버의 오프셋을 가져옵니다. 이 메소드는 주소 0을 해당 유형의 구조체에 캐스팅 한 다음 멤버의 주소를 가져 와서 수행합니다.

+0

C/C++ 컴파일러는 최근에 C++에서 오버로드 된 연산자로이 기술을 깨뜨릴 수 있기 때문에 또한 기술적으로 정의되지 않은 동작이기 때문에이 기술을 내장 한 기능을 추가하고 있습니다. 충분히 공격적인 포인트 - 투 - 최적화 위반을 상상할 수 있습니다 그것. – zwol

+0

@Zack : 라이브러리 기능이므로 아니요, 정의되지 않은 동작이 아닙니다. 구현은 원하는대로 구현할 수 있습니다. – GManNickG

+1

그는이 매크로가 응용 프로그램 내에서 정의된다는 것을 암시합니다.이 매크로는 정의되지 않은 동작입니다 (물론 예상대로 작동 할 가능성은 매우 높지만). 정의가 표준 라이브러리에 있다면 그것은 물론 정의되지 않을 것입니다. – jcoder

0

는 그것은 §7.17/3 항 같습니다

구조 부재에 size_t의 바이트 오프셋 의 값을 입력 갖는 정수 상수 표현으로 확장

offsetof(type, member-designator)
(지정 회원 지정자), 구조체 시작 부분 (유형으로 지정). 형식 및 구성원 지정자 은 주어진
static type t;
이어야하며 식 &(t.member-designator)은 주소 상수로 평가됩니다. 합니다 ( 지정된 멤버가 비트 필드 인 경우, 동작은 정의되지 않습니다.)

라이브러리가 반드시 언어 규칙을 준수하지 않기 때문에, 구현은 기뻐하지만 결과를 얻을 무료입니다.

구현 방법에 신경을 쓰지 않기 때문에이 특정 구현의 결과는 이 아니며은 정의되지 않은 동작입니다. (즉, 널 포인터를 통한 간접 참조의 주소가 잘 정의되어 있음을 보증합니다. 물론 자신의 프로그램에서 이것을 가정 할 수는 없습니다.)

일부 라이브러리에는 다시 정의 됨)은 offsetof으로 정의되었으므로 프로그램 동작이 정의되지 않았으며 대신 표준 라이브러리를 사용해야합니다. (인형)

관련 문제