2013-09-02 5 views
2

"size"매개 변수가있는 함수를 쓰고 있는데 크기 값에 따라 unsigned char 또는 unsigned int 또는 unsigned int 형식을 사용합니다. 일반적으로, 나는 그런 식으로 뭔가를 할 노력하고있어 : 내가 "만약"의 "메모리"외부에서 사용할 수매개 변수로 형식을 C에서 전달합니다.

if (size == 1) {unsigned char * memory = calloc(sizeOfFile,1);} 
if (size == 2) {unsigned short * memory = calloc(sizeOfFile,1);} 
if (size == 4) {unsigned int * memory = calloc(sizeOfFile,1);} 

. 그럴 수있는 방법이 있습니까? 또는 "if"에 3 번 내 기능을 복사해야합니까?

미리 감사드립니다.

+4

'memory'가 할당 된 후에는 무엇을합니까? 귀하의 본보기는 그것이 범위를 벗어나게합니다; 실제 코드에서는 그렇게되지 않는다고 가정합니다. – dasblinkenlight

답변

5

형식이 컴파일 타임 개념이기 때문에 형식을 C 함수에 전달할 방법이 없습니다. 컴파일러가 끝나면 형식에 대한 지식이 없습니다. 유형에 대한 지식은 컴파일러에서 생성하는 바이너리 코드로 "구워지고"추가 메타 데이터없이 프로그램에서 사용할 수 있습니다.

형식을 전달하는 대신 크기를 전달하고 직접 포인터 연산을 수행 할 수 있습니다. 예를 들어, qsort 또는 bsearch 함수를 취하면 정확한 유형을 알고있는 것처럼 유형이 지정되지 않은 배열에서 작동합니다. 이 기능을 가능하게하는 "마법"은 size_t nel 매개 변수에 있고 const void * 인수를 취하는 함수 포인터입니다.

동일한 방식으로 API를 모델링 할 수 있습니다. 이미 size을 매개 변수로 사용하고 있으므로 남아있는 것은 포인터 연산입니다. 포인터를 char *으로 변환하여 size을 추가하면 포인터가 "유형"의 다음 요소로 포인터를 이동하고 산술을 수행하여 대상에 포인터를 올린 다음 포인터를 다시 void*으로 변환합니다.

0

당신이하고 싶은 일에 달려 있습니다.

할당은 모두 sizeofFile 바이트를 할당합니다. 이는 아마도 사용자가 원하는 것이 아닙니다.

void * 포인터를 사용할 수 있지만 나중에 액세스 할 때 유형을 확인해야합니다.

귀하의 질문이 구체적이라면 도움이 될 것입니다.

+0

@sharth D' oh, 절대적으로 사실입니다, 고마워요. 나는 편집했다. – unwind

1

일반적으로 void * 포인터를 사용하고 별도의 변수에서 유형을 추적합니다.

2

당신이 매크로 쓸 수있는 상대적으로 작은 함수의 경우

#define FOO(T, x, y, z) do \ 
{ \ 
    T * memory = calloc(sizeOfFile, 1); \ 
    ... \ 
    ... \ 
    ... \ 
} while(0) 

당신은 다음과 같이 부를 것이다, 예를 들어,이

FOO(char, x, y, z); 

또는

FOO(int, x, y, z); 

그것은 추한 및 매크로에 대한 일반적인주의 사항이 적용되지만 경우에 따라서는 합리적인 해결책이 될 수

.

관련 문제