다른 답변을 시작하겠습니다.
struct Value
{
int nValue;
float fOtherValue;
};
int main()
{
Value theValue;
theValue.nValue = 220;
theValue.fOtherValue = 3.14f;
printf("Value: %d", theValue);
}
이 코드는 아무런 문제없이 220
을 인쇄합니다. 당신이 theValue
후 두 번째 인수를 전달하지만, 늘 그 : 첫 번째 변수 인수 theValue
이후
printf("Values: %d, %f", theValue, theValue.fOtherValue);
은 %d
인수로 지정한 크기에 맞지 않습니다. 따라서 3.14
은 표시되지 않을 수도 있습니다. printf
, 인수 스택을 밀어 넣는 방법, va_start
등이 작동하는 방식을 설명하지 않겠습니다. 우리가 String
클래스 이런 식으로 디자인 할 때
마찬가지로 :
struct String
{
char* pData;
public:
String()
{
pData = new char[40];
strcpy_s(pData, 40, "Sample");
}
};
를 그리고이 방법을 사용
String str;
printf("%s", str);
확실히 작동합니다.
하지만 인수 및 호출 스택 손상은 어떻게됩니까? 클래스의 크기 (예 : Value
)가 (%d
) 형식으로 지정된 데이터 크기 (Value
의 경우 4)보다 큰 경우 어떨까요? 음,이 경우 클래스는 주어진 클래스의 크기가 printf
함수가 사용하는 인수 크기와 동일한 지 확인해야합니다.
자세한 내용은 언급하지 않지만 CString
은 내부 클래스 CStringData
을 사용합니다. 후자의 클래스는 문자열, 길이, 참조 횟수 등을 보유합니다. CString
(실제로는 CSimpleStringT
)은이 클래스를 사용하지만 CStringData
에 의해 관리되는 char
/wchar_t
의 포인터 만 보유합니다.
크게는 String
클래스로 구현됩니다 (데이터 및 sizeof
까지). CString
이 크게 구현됩니다.
가변적 인 템플릿을 사용하는 CString :: Format입니까? CString은 char에 대한 포인터 인 하나의 속성만을 포함합니까? –
void __cdecl CString :: Format (_In_ _Printf_format_string_ PCXSTR pszFormat, ...); – surega
http://stackoverflow.com/questions/205529/c-c-passing-variable-number-of-arguments-around –