2011-01-14 6 views
0

라이브러리의 구조 (C 언어)에서 요소 (이름 &)를 결정할 수 있습니까? 그렇다면 C 언어로하는 방법? C 언어가 그것을 지원하지 않는다면, 다른 트릭들로 구조체 요소를 얻는 것이 가능한가 아니면 거기에 어떤 도구가 있는가?C 언어로 구조의 요소 찾기

답변

3

아니요, 불가능합니다. C는 리플렉션 스타일을 지원하지 않습니다.

5

프로그래밍 할 때 또는 런타임에 동적으로 알아내는 것을 의미합니까?

이전에는 확실합니다. 그냥 포함하는 .h 파일을 찾아 모든 필드를 포함하여 구조체 정의를 찾을 수 있습니다.

후자의 경우, 불가능합니다. C는 구조체를 컴퓨터 코드로 컴파일하여이 모든 정보가 손실됩니다. 당신이 구조체 {int x, float y, int z} 있고, 예를 들어, 당신은 기계 코드에

a = mystruct.y 

을 말한다 일부 코드, 남아있는 모든이 (그것의 크기를 4를 추가, mystruct에 대한 포인터를 찾는 같은 것입니다이 int)를 읽고 거기에서 4 바이트를 읽은 다음 부동 소수점 연산을 수행합니다. 이러한 구조체 필드의 이름이나 유형은 전혀 액세스 할 수 없으므로 런타임에 찾을 수있는 방법이 없습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 컴퓨터 코드에서 mystruct를 찾으려면 어떻게해야합니까? –

+0

어셈블리를 읽고 이해해야합니다 (완전히 다른 언어). 그러나 나는 그것이 당신이 의미하는 것이라고 생각하지 않습니다. 어쩌면 내가 "신비에 포인터를 찾는 것과 같은 것"이라고했을 때 당신은 오해했을 것입니다. 나는 생성 된 코드가'mystruct'가 어디에 있는지 알게 될 것이고 (아마도 스택으로부터 주소를 취할 것입니다), 필요한 산술 연산을 수행 할 것임을 의미합니다. 그러나 런타임에 필드의 이름과 유형을 알 수있는 충분한 정보가 없습니다. – mgiuca

0

"구조체의 요소를 결정하십시오"라는 말은 "해당 구조체 형식의 선언을 프로그래밍 방식으로 얻는다"는 의미입니다. 그렇다면 적어도 이식 할 수는 없다고 생각합니다. Java와 같은 최신 언어와 달리 C는 실제 프로그램에서 사용할 수있는 형식으로 유형 정보를 보관하지 않습니다.

편집 :

그것은 "이식"불가능한 것에 대해 내 의견을 명확히하려면 :

아주 잘가 생성하는 오브젝트 파일에서 필요한 정보를 포함 할 일부 컴파일러 + 디버깅 형식 조합이있을 수 있습니다 , 비록 내가 말할 수는 없지만 을 알고있다. 그런 다음,가 상적으로 프로그램이 자체 실행 파일을 열고 디버깅 정보를 구문 분석 할 수 있습니다. 그러나 이것은 기껏해야 번거롭고 연약한 접근법입니다 ...

왜 그런 식으로해야합니까?

+0

구조체에 API로 데이터를 포장했지만 콘솔에 값을 인쇄하려고하면 올바른 값이 인쇄되지 않습니다. 그래서, 만약 내가 정확히 어디에 구조가 데이터를 저장 점점 알고, 나는 그것을 밖으로 인쇄 할 수있을 것입니다 따라서 구조의 특정 요소를 찾으려고 노력. –

+0

@ S.Man : 몇 가지 샘플 코드로 질문을 업데이트 할 수 있습니까? 가변 형식 (일반적으로 공용체를 사용하여)을 가진 구조체를 생성하는 대부분의 C API는 하나 이상의 필드를 가지므로 각 인스턴스가 어떤 형식을 따르는 지 알 수 있습니다. 형식이 가변적이지 않으면 요소를 직접 참조해야합니다. – thkala

+0

@ S.Man 정렬 (포장) 문제가 발생할 수도 있습니다 .... – T33C