2014-04-07 5 views
2
#define my_sizeof_one(type) (char *)(&type+1)-(char*)(&type) 

int main(void) 
{ 
    int answer; 
    short x = 1; 
    long y = 2; 
    float u = 3.0; 
    double v = 4.4; 
    long double w = 5.54; 
    char c = 'p'; 

    uint32_t e = 653; 
    uint16_t f = 44; 
    uint64_t g = 2323232; 


    typedef enum 
    { 
     kCountInvalid, 
     kCountOne, 
     kCountTwo, 
     kCountThree, 
     kCountFour, 
    }k_count_t; 

    /* __DATE__, __TIME__, __FILE__, __LINE__ are predefined symbols */ 
    #if 1 
    printf("Date : %s\n", __DATE__); 
    printf("Time : %s\n", __TIME__); 
    printf("File : %s\n", __FILE__); 
    printf("Line : %d\n", __LINE__); 
    #endif 

    /* The size of various types */ 
    printf("The size of int    %zu\n", my_sizeof_one(answer)); 
    printf("The size of short   %zu\n", my_sizeof_one(x)); 
    printf("The size of long   %zu\n", my_sizeof_one(y)); 
    printf("The size of float   %zu\n", my_sizeof_one(u)); 
    printf("The size of double   %zu\n", my_sizeof_one(v)); 
    printf("The size of long double  %zu\n", my_sizeof_one(w)); 
    printf("The size of char   %zu\n", my_sizeof_one(c)); 
    printf("The size of enum   %zu\n", my_sizeof_one(k_count_t)); 

    printf("The size of uint16_t  %zu\n", my_sizeof_one(f)); 
    printf("The size of uint32_t  %zu\n", my_sizeof_one(e)); 
    printf("The size of uint64_t  %zu\n", my_sizeof_one(g)); 

    return 0; 
} 

나는 다음과 같은 오류 얻을 : my_sizeof는 설명 C.Can 누군가에 열거 된 데이터 유형에 대한 작동하지 않는 몇 가지 이유를 들어my_sizeof 매크로 열거 데이터 형식 작동하지 않습니다

error: expected expression before 'k_count_t' 
error: expected expression before 'k_count_t' 

을 이유가 뭐야?

+2

k_count_t에 매크로 및 하위 문구를 입력하십시오. 답변이 명확 해집니다. 유형의 주소를 사용할 수 없습니다. 다른 모든 사용법은 변수를 전달하는 것처럼 보입니다. –

+0

하지만 정상적인 sizeof() 빌드 C에서 매크로가 열거 형 데이터 형식에 대해 작동합니까 – liv2hak

+1

'normal sizeof()'는 매크로가 아니며 컴파일러가 이해할 수있는 연산자입니다 –

답변

3

매크로에 형식을 전달하고 유형에 대해 매크로가 작동하지 않는 것이 문제입니다. 왜냐하면 당신은 한 종류의 주소를 취할 수 없기 때문입니다.

매크로의 매개 변수 이름을 type으로 지정했는데 그 이름이 잘못되었습니다. 매크로는 유형이 아닌 변수를 허용합니다. 음, 엄격하게 그것은 당신이 & 연산자를 사용하여 주소를 가져갈 수있는 것을 받아들입니다. 매크로의 다른 모든 용도는 변수와 관련이 있습니다. 매크로에 k_count_t 유형의 변수를 제공하면 컴파일러가 행복해집니다.

물론 배워야 할 진정한 교훈은 자연과 같은 sizeof을 사용하는 것입니다.

+0

정상적인 sizeof() 매크로 빌드 C에서 열거 형 데이터 형식을 작동합니다 – liv2hak

+1

다시 대답을 읽어주십시오. 이 문제는 열거 형과 전혀 관련이 없습니다. 문제는 유형과 변수의 차이입니다. 'sizeof'는 매크로가 아닙니다. 하나는'sizeof'를 사용하지 않는 이유가 궁금합니다. –

+1

예를 들어 도움이 될 것입니다. printf ("int % zu의 크기 \ n", my_sizeof_one (int)); 같은 문제가 있습니다. printf ("짧은 % zu 크기 \ n", my_sizeof_one (짧은)); 등. . –