2012-03-16 1 views
-4

우리는 모두 C 언어로 sizeof 연산자에 익숙합니다. 모든 종류의 데이터 형식을 흡수하고 크기를 반환하는 유사한 작동 함수를 만들려고합니다.C sizeOf 연산자 : myOwnSizeOf() 함수를 만들고 싶습니다.

"C"에서 이와 유사한 기능을 만드는 방법을 누군가가 말해 줄 수 있습니까?

int myOwnSizeOf(/*what would be parameter type?*/) 
{ 
    //and what about the definition? 
} 

감사

+4

원래 'sizeof'의 문제점은 무엇입니까? – PeterK

+0

답변을 구하는 사람이 있습니까? –

+1

이유가 * 연산자 *입니다. 당신은 할 수 없습니다. –

답변

1

런타임에 함수가 평가되기 때문에 결코 데이터 유형을 사용할 수 없으며 객체 만 사용할 수 있습니다. 그래서 sizeof은 내장 연산자입니다.

템플릿 기능을 사용하여 C++에서 제한된 경우에 사용할 수 있습니다. 그러나 C에서 모든 데이터 유형의 객체를 사용할 수있는 유일한 방법은 void 포인터 또는 매크로입니다. 그러나 전자는 형식 정보를 잃어 버렸고 후자는 이미 도마뱀에 의해 제안되었으며 그가 지적한대로 아무 것도 사지 않을 것입니다 (어쨌든 기능이 아닙니다).

7

당신은 기능을 할 수 없어. 그래서 sizeof은 라이브러리 기능이 아닌 언어에 내장 된 연산자입니다. 그것은 마술입니다.

당신은

#define myOwnSizeOf(x) (sizeof(x)) 

을 할 수 있지만 난 정말 지점을 표시하지 않습니다.

+0

감사하지만 객관적인 C ("id")처럼 런타임에 모든 종류의 데이터 유형을 사용할 수있는 방법이 없습니다. –

+0

void 포인터 :'void *'(당연히 당신을 도울 수 없다) –

+1

@Pankaj : 아니, C가 아니다. Brian이 지적했듯이, 변수의 주소를'void *' (정수 또는 실수 리터럴을 인수로 전달할 수 없음을 의미). 그런 다음 필요한 유형 정보를 정확히 버렸습니다. C는 최소한 기본적으로 반사 기능을 지원하지 않습니다. –

0

함수는 그것을 할 수는 없지만 매크로 수, 당신은하지 /별로 중요하지 않습니다 수 있습니다 약간의 기술적 인 UB 던지 상관하지 않는 경우 : 당신이

#define mysizeof(T) (size_t)((char *)((T*)0+1)-(char *)0) 

교체 한 경우 0의 크기와 정적 저장 기간 객체의 주소가 다른 객체보다 커지면 UB가 사라집니다.

편집 : 이것은 T 유형에 해당합니다. 변수를위한 버전이 훨씬 더 쉽습니다 :

#define mysizeof(v) (size_t)((char *)(&v+1)-(char *)&v) 
+0

안녕하세요, UB가 필요 없습니다 –

+0

내가 제안한 수정 사항이 부족한 UB가없는 버전이 있습니까? –

+0

'offsetof (struct {T a; char b}, b)'와 같은 것 : –