C에서 파라메터에 복수개의 함수 지정

gauibauibo의 이미지

소스 분석중에 아래와 같은 코드가 있는데

char Test[] = "Test string"
unsigned char slide[512];
 
void message(unsigned char* buf, unsigned log size, int flag)
{
    printf("buf: %s \n", buf);
    printf("size: %d \n", size);
    printf("flag: %d \n", flag);
 
    return;
}
 
int main(void)
{
    message( (unsigned char*)("test"), 
        (unsigned long)(sprintf ((char*)slide, (char*)Test), strlen((char*)("test"))),
        (flag) );
 
    return 0;
}

message 함수의 두번째 파라메터의 동작원리가 이해가 되지 안습니다.

neogeo의 이미지


(unsigned long)(sprintf ((char*)slide, (char*)Test), strlen((char*)("test"))

는 sprintf 라는 함수를 수행하고 리턴값을 다시 파라메터로 쓴 것 뿐입니다.

unsigned long temp_p = (unsigned long)( sprintf ((char*)slide, (char*)Test), strlen((char*)("test"));
 
 message( (unsigned char*)("test"), 
        (temp_p),
        (flag) );

로 호출한것과 동일한 효과입니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

gauibauibo의 이미지

코드를 보시면 아시겠지만

파라메터가

 (unsigned long)(sprintf(~~~),strlen(~~~))

되어 있습니다.

여기서 strlen()이 sprintf()의 인자로 사용된게 아닙니다.

그리고 코드를 실행하면 파라메터 size는 sprintf()의 리턴 값이 아니라 strlen()의 리턴값을 받아 옵니다.

neogeo의 이미지

message 의 parameter 라고 하셔서 속았습니다..

, operator ( comma operator ) 에 대해 찾아보시면 잘 아실 수 있습니다.

(expr) , (expr) 의 경우 expr 을 모두 평가한뒤, 왼쪽 expr 을 버리고 오른쪽 expr 만을 취합니다.

최종적으로 둘다 수행은 된뒤 strlen 값만을 message 함수의 파라미터로 쓰게 되겠지요.

Neogeo - Future is Now.

Neogeo - Future is Now.