네이티브 C++ 식의 제한
이 항목은 다음 언어에 적용됩니다.
Edition |
Visual Basic |
C# |
/F |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
네이티브 전용 |
||||
Pro, Premium 및 Ultimate |
네이티브 전용 |
디버거 창에 C/C++ 식을 입력하면 다음과 같은 일반적인 제한이 적용됩니다.
액세스 제어
디버거는 액세스 제어에 관계 없이 모든 클래스 멤버에 액세스할 수 있습니다. 따라서 기본 클래스와 포함된 멤버 개체뿐 아니라 모든 클래스 개체 멤버를 검사할 수 있습니다.
모호한 참조
디버거 식이 모호한 멤버 이름을 참조하면 클래스 이름을 사용하여 한정해야 합니다. 예를 들어, CObject가 AClass 및 BClass에서 expense라는 멤버 함수를 상속하는 CClass의 인스턴스이면 CObject.expense는 모호한 참조입니다. 다음과 같은 방법으로 모호성을 해결할 수 있습니다.
CObject.BClass::expense
식 계산기에서는 모호성을 해결하기 위해 멤버 이름에 표준 우위 규칙을 적용합니다.
익명 네임스페이스
네이티브 C++ 식 계산기는 익명 네임스페이스를 지원하지 않습니다. 예를 들어 다음과 같은 코드가 있다고 가정합니다.
#include "stdafx.h"
namespace mars
{
namespace
{
int test = 0;
}
}
int main()
{
// Adding a watch on test does not work.
mars::test++;
return 0;
}
이 예제에서 기호 test를 조사하려면 데코레이팅된 이름을 사용해야 합니다.
(int*)?test@?A0xccd06570@mars@@3HA
생성자, 소멸자 및 변환
명시적으로나 암시적으로 임시 개체 생성을 호출하는 식을 사용하여 개체에 대한 생성자나 소멸자를 호출할 수 없습니다. 예를 들어, 다음 식을 사용하여 명시적으로 생성자를 호출하면 오류 메시지가 나타납니다.
Date( 2, 3, 1985 )
클래스로 변환하는 경우에는 변환 함수를 호출할 수 없습니다. 이러한 변환에는 개체 생성이 포함됩니다. 예를 들어, myFraction 이 변환 함수 연산자 FixedPoint를 정의하는 CFraction의 인스턴스인 경우에 다음 식을 사용하면 오류가 발생합니다.
(FixedPoint)myFraction
그러나 기본 제공 형식으로 변환하는 경우에는 변환 함수를 호출할 수 있습니다. CFraction이 변환 함수 operator float를 정의하면 디버거에서 다음 식을 사용할 수 있습니다.
(float)myFraction
개체를 반환하거나 지역 개체를 선언하는 함수를 호출할 수 있습니다.
new 또는 delete 연산자는 호출할 수 없습니다. 디버거에서 다음 식을 사용하면 제대로 실행되지 않습니다.
new Date(2,3,1985)
상속
디버거를 사용하여 가상 기본 클래스가 있는 클래스 개체를 표시하면, 각 상속 경로마다 가상 기본 클래스의 멤버가 표시됩니다. 그러나 이 멤버의 인스턴스는 하나만 저장됩니다.
가상 함수 호출은 식 계산기에서 올바르게 처리됩니다. 예를 들어, CEmployee 클래스에서 가상 함수 computePay가 정의되는데, 이 함수가 CEmployee로부터 상속되는 클래스에서 재정의된다고 가정합시다. 그러면 CEmployee에 대한 포인터를 통해 computePay를 호출하여 해당 함수를 실행할 수 있습니다.
empPtr->computePay()
파생된 클래스 개체에 대한 포인터를 기본 클래스 개체에 대한 포인터로 캐스팅할 수는 있지만 반대로 캐스팅할 수는 없습니다.
내장 및 인라인 함수
디버거 식에서는 일반 함수로 한 번 이상 나온 함수만 내장 함수나 인라인 함수로 사용하여 호출할 수 있습니다.
숫자 상수
디버거 식에는 8진수, 16진수 또는 10진수 정수 상수를 사용할 수 있습니다. 디버거의 기본 설정은 10진수 상수를 사용하도록 설정되어 있습니다. 이 설정은 디버깅 탭의 일반 페이지에서 변경할 수 있습니다.
접두 또는 접미 기호를 사용하면 다른 형식의 숫자를 표시할 수 있습니다. 다음 표에서는 사용할 수 있는 형식을 설명합니다.
구문 |
예제(10진수 100) |
기준 |
---|---|---|
digits |
100 또는 64 |
현재 설정에 따라 10진수 또는 16진수 |
0digits |
0144 |
8진수 |
0ndigits |
0n100 |
10진수 |
0xdigits |
0x64 |
16진수 |
digitsh |
64h |
16진수 |
연산자 함수
디버거 식에서는 암시적으로나 명시적으로 클래스에 대한 연산자 함수를 호출할 수 있습니다. 예를 들어, myFraction 및 yourFraction이 operator+를 정의하는 클래스의 인스턴스라고 가정합시다. 다음 수식을 사용하면 두 개체의 합을 표시할 수 있습니다.
myFraction + yourFraction
연산자 함수가 friend로 정의되면, 멤버 함수에 대한 구문과 동일한 구문을 사용하여 암시적으로 호출할 수도 있고, 다음과 같이 명시적으로 호출할 수도 있습니다.
operator+( myFraction, yourFraction )
일반 함수와 마찬가지로 연산자 함수는 개체 생성을 포함한 변환이 필요한 인수를 사용하여 호출할 수 없습니다.
디버거는 const 및 비 const 버전이 있는 오버로드된 연산자를 지원하지 않습니다. const 및 비 const 버전이 있는 오버로드된 연산자는 표준 템플릿 라이브러리에 자주 사용됩니다.
오버로딩
함수가 정확하게 일치하거나 개체 생성을 포함한 변환을 하지 않고도 일치하는 경우에는 디버거 식에서 오버로드된 함수를 호출할 수 있습니다. 예를 들어, calc 함수에서 CFraction 개체를 매개 변수로 사용하고 CFraction 클래스에 정수를 받는 단일 인수 생성자가 정의될 경우, 다음 식을 사용하면 오류가 발생합니다.
calc( 23 )
calc에 적합한 CFraction 개체로 정수를 변환하는 올바른 변환이 있더라도 이러한 변환은 개체 생성을 포함하므로 지원되지 않습니다.
우선 순위
디버거 식에 포함된 C++ 범위 연산자(::)는 소스 코드에 있는 범위 연산자보다 우선 순위가 낮습니다. C++ 소스 코드에서는 범위 연산자의 우선 순위가 가장 높습니다. 디버거에서 범위 연산자의 우선 순위는 기본 및 후위 연산자(->, ++, --)와 단항 연산자(!, &, * 등) 사이입니다.
기호 형식
모든 디버그 정보(/Zi 또는 /ZI)를 사용하여 컴파일된 모듈에 기호가 있으면 소스 코드에 사용된 폼과 동일한 폼의 기호를 포함하는 디버거 식을 입력합니다. /Zd를 사용하여 컴파일된 모듈이나 라이브러리의 공용 기호가 포함된 식을 입력할 경우에는 개체 코드에 사용되는 형식의 데코레이팅된 기호 이름을 사용해야 합니다. 자세한 내용은 /Z7, /Zd, /Zi, /ZI(디버깅 정보 형식)를 참조하십시오.
LINK /MAP 옵션을 사용하면 데코레이드된 형식과 데코레이팅되지 않은 형식의 모든 이름 목록을 얻을 수 있습니다. 자세한 내용은 /MAP(맵 파일 생성)을 참조하십시오.
이름 데코레이션은 형식 안전 링크를 적용하는 데 사용하는 메커니즘입니다. 즉, 철자, 대/소문자, 호출 규칙, 형식 등이 정확하게 일치하는 이름과 참조만이 서로 링크됩니다.
암시적 또는 명시적으로 _cdecl 키워드를 사용하여 C 호출 규칙으로 선언되는 이름은 밑줄(_)로 시작합니다. 예를 들어, main 함수는 _main으로 표시될 수 있습니다. _fastcall로 선언되는 이름은 @ 기호로 시작합니다.
C++에서 데코레이팅된 이름은 호출 규칙 외에 기호 형식을 인코딩합니다. 이 이름 형식은 너무 길어서 읽기 어렵습니다. 이름은 하나 이상의 물음표(?)로 시작합니다. C++ 함수의 데코레이션에는 함수 범위, 함수 매개 변수 형식 및 함수 반환 형식이 포함됩니다.
형식 캐스팅
형식으로 캐스팅하면 그 형식을 디버거에 전달해야 합니다. 프로그램에는 동일한 형식의 다른 개체가 있어야 합니다. typedef 문을 사용하여 만든 형식은 사용할 수 없습니다.