2011-03-17 3 views
0

C의 printf() , scanf(), etc과 같은 변수 길이 인수 목록의 기능은 C++의 함수 오버로드와 어떻게 다릅니 까?C로 오버로딩 되었습니까?

와 S는 다음과 같이 정의된다

printf("Didnt Work %s",s);

printf(s,"Didnt Work %s");

다를 호출 수행 방법 :

const char *s="string"; 

가 설명해주십시오에게.

const char *s="string"; 
printf(s,"Didnt Work %s"); 

첫 번째 인수 "문자열"에서

답변

6

형식 문자열로 해석됩니다. 삽입 코드가 없으므로 두 번째 매개 변수는 사용되지 않습니다. 결과는 "문자열"이됩니다.

OTOH

printf("Didnt Work %s",s); 

가 삽입 코드는, 그래서 두 번째 인수가 문자열, 결과는 "문자열을 작동하지 않았다"있는 그대로 삽입됩니다.

오버로드와는 다른 인수 유형이 가능하지만 가변 인수를 사용하면 동일한 함수가 항상 호출되므로 오버로드가 발생하지 않습니다. 오버로딩을 사용하면 인수 유형에 따라 다른 함수가 호출됩니다.

0

오버로드를 사용하면 컴파일러에서 확인할 매개 변수의 특정 순서를 지정할 수 있습니다. C++에서 유형이 함수 정의 중 적어도 하나와 일치하지 않으면 컴파일러는 불평 할 것입니다. 반면에 가변 길이 인수를 가진 C는 ... 컴파일 타임에이 유형 검사를하지 않습니다. 컴파일러는 매개 변수를 확인하지 않고 줄을 지어 있는지 확인합니다. 모든 컴파일러가 아닌 대부분의 컴파일러에서 printf("1",3);을 컴파일 할 수 있습니다. Printf는 첫 번째 인수를 문자열로 읽으려고 시도하고 문자열의 끝을 나타내는 빈 바이트에 도달 할 때까지 계속 읽습니다. 이것이 가변 길이 인수 목록이 사용되는 이유입니다.

+1

'printf (1,3);'는 어떤 컴파일러에서도 컴파일되지 않습니다. 'printf'의 첫 번째 인자는 타입 화됩니다. 즉,'const char *'를 기대합니다. 그러나 변수 길이 인수가 형식에 안전하지 않다는 원칙에 대한 귀하의 주장은 정확합니다. –

+0

당신은 완전합니다. 나는 그것을 고쳐야한다 ... – datdo

0

두 번째 질문에 답하기 위해 다른 사람들은 이미 첫 번째 질문에 답했습니다.

C의 변수 인수 목록은 C++의 오버로드와 매우 다릅니다. C에서는 하나의 함수 printf을 가지며, 다른 유형의 인수를 사용하는 경우가 많습니다. C++에서 오버로딩을 사용하면 인수의 유형에 따라 다른 함수를 선택할 수 있습니다.