다음을 통해 공유


힌트 파일

A 힌트 파일 수 있는 Visual Studio 통합된 개발 환경 (IDE) Visual C++ 식별자를 함수 및 매크로의 이름 해석 합니다.Visual C++ 프로젝트, IDE를 열 때 구문 분석 시스템 프로젝트에서 각 소스 파일의 코드를 분석 하 고 모든 식별자에 대 한 정보를 수집 합니다.IDE와 같은 기능을 지원 하도록 해당 정보를 사용 하 여 다음의 클래스 뷰 브라우저와 탐색 모음.

구문 분석 시스템에 도입 Visual C++ 2010C/c + + 구문을 이해 하기는 하지만 매크로가 포함 된 문을 잘못 해석할 수 있습니다.매크로 소스 코드 작성 구문적으로 잘못 된 것 이면 문은 잘못 해석할 수 있습니다.해당 소스 코드가 컴파일되고 전처리기에서 대체 하면 구문상 올바른 문이 될 수 있는 매크로 식별자 정의 합니다. 구문 분석 시스템은 힌트 파일을 사용 하 여 매크로 해석 하므로 프로젝트를 빌드하지 않고도 작동 합니다. 따라서 같은 탐색 기능 클래스 뷰 즉시 사용할 수 있습니다.

힌트 파일에 사용자 지정 가능한 포함 힌트에 있는 C/c + + 매크로 정의와 동일한 구문의.Visual C++ 대부분의 프로젝트에 대 한 충분 한 기본 제공 힌트 파일이 포함 되어 있지만 Visual Studio 식별자를 처리 하는 방식을 향상 시키기 위해 자신의 힌트 파일을 만들 수 있습니다.

시나리오

다음 코드를 검사 하는 소스 파일이 있다고 가정 하면 클래스 뷰 브라우저입니다.는 STDMETHOD 매크로 라는 메서드를 선언 합니다. myMethod 하나의 매개 변수를 사용 및에 대 한 포인터를 반환 하는 HRESULT.

// Source code file.
STDMETHOD(myMethod)(int parameter1);

다음 매크로 정의 별도 헤더 파일에 있습니다.

// Header file.
#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method)
#define STDMETHODCALLTYPE __stdcall
#define HRESULT void*

STDMETHOD 라는 함수를 나타나기 때문에 구문 분석 시스템에서는 소스 코드를 해석할 수 없습니다 및 두 가지 매개 변수 목록이 있기 때문에 해당 선언 구문이 올바르지 않습니다.구문 분석 시스템 헤더 파일에 정의를 찾기 위해 열리지는 STDMETHOD, STDMETHODCALLTYPE를 하 고 HRESULT 매크로입니다.구문 분석 시스템을 해석할 수 없는 때문에 해당 STDMETHOD 매크로 문 전체를 무시 하 고 구문 분석을 계속 합니다.

프로젝트에 하나 이상의 중요 한 헤더 파일에 달라질 수 있으므로 구문 분석 시스템에서는 헤더 파일을 사용 하지 않습니다.모든 헤더 파일이 변경 되 면 구문 분석 시스템에서는 모든 IDE의 성능이 저하 되는 프로젝트에 헤더 파일을 다시 확인 할 수 있습니다.구문 분석 시스템에서 처리 하는 방법을 지정 하는 힌트를 사용 하는 대신의 STDMETHOD, STDMETHODCALLTYPE를 하 고 HRESULT 매크로입니다.

힌트가 필요한 것을 어떻게 알 수 있습니까?및 힌트가 필요한 경우 종류를 만들어야 합니다.힌트 필요 하다 고입니다 경우 보기에서 식별자 클래스 뷰 보기와 일치 하지 않습니다의 편집기.예를 들어, 클래스 뷰 할 수 있는지 알고 클래스 멤버 표시 또는 멤버의 이름을 올바르지 않습니다.일반적인 문제 해결 힌트 유형에 대 한 자세한 내용은 어떤 매크로 필요는 힌트를 참조 하십시오.? 이 항목의 뒷부분에 있는 섹션입니다.

아키텍처

힌트 파일에 실제 디렉터리와 관련 된, 표시 된 논리적 디렉터리가 아니라 솔루션 탐색기.힌트 파일을 프로젝트에 적용 하려면 힌트 파일 추가 하지 않아도 됩니다.만 소스 파일을 구문 분석할 때 구문 분석 시스템은 힌트 파일을 사용 합니다.

모든 힌트 파일의 이름은 cpp.hint.따라서 많은 디렉터리 힌트 파일을 포함할 수 있지만 하나의 힌트 파일에 특정 디렉터리에 발생할 수 있습니다.

0 개 이상의 힌트 파일에서 프로젝트를 받을 수 있습니다.힌트 파일이 없으면 구문 분석 시스템 해석 불가능 한 소스 코드를 무시 하려면 오류 복구 기법을 사용 합니다.그렇지 않으면 구문 분석 시스템에서는 다음과 같은 전략을 사용 하 여 찾고 힌트를 수집 하.

검색 순서

구문 분석 시스템은 힌트 파일 디렉터리 다음 순서 대로 검색합니다.

  • (Visual C++ 대 한 설치 패키지를 포함 하는 디렉터리vcpackages).와 같이 자주 사용 하는 시스템 파일의 기호를에서 설명 하는 기본 제공 힌트 파일이이 디렉터리에 있습니다. windows.h.따라서 프로젝트가 필요한 힌트의 대부분을 자동으로 상속 합니다.

  • 원본 파일이 들어 있는 디렉터리에서 루트 디렉터리의 소스 파일의 경로입니다.일반적인 Visual C++ 프로젝트의 루트 디렉터리 솔루션 또는 프로젝트 파일을 포함합니다.

    이 규칙의 예외는 경우는 파일을 중지 합니다. 원본 파일의 경로입니다.중지 파일 검색 순서에 대 한 추가 제어를 제공 하 고 라는 파일입니다. cpp.stop.루트 디렉터리에서 시작 하는 대신 구문 분석 시스템을 중지 파일을 원본 파일이 들어 있는 디렉터리를 포함 하는 디렉터리에서 검색 합니다.일반적인 프로젝트의 경우 중지 파일이 필요는 없습니다.

힌트 수집

힌트 파일 0 개 이상 포함 힌트.힌트를 정의 하거나 C/c + + 매크로 처럼 바로 삭제 합니다.즉,는 #define 전처리기 지시문은 힌트 만들거나, 재정의 및 #undef 지시문은 힌트를 삭제 합니다.

구문 분석 시스템에서는 앞에서 설명한 검색 순서에 각 힌트 파일을 열고, 각 파일의 힌트 집합에 누적 유효한 힌트를 클릭 하 고 다음 유효한 힌트를 사용 하 여 사용자 코드의 식별자를에서 해석 합니다.

구문 분석 시스템에서는 다음 규칙을 사용 하 여 힌트를 누적 합니다.

  • 새 힌트를 아직 정의 되지 않은 이름을 지정 하는 경우 새 힌트는 이름을 유효한 힌트에 추가 합니다.

  • 새 힌트는 이미 정의 된 이름을 지정 하는 경우 새 힌트는 기존 힌트를 재정의 합니다.

  • 경우 새 힌트는 #undef 기존의 유효한 힌트 지정 지시문, 새 힌트는 기존 힌트를 삭제 합니다.

첫 번째 규칙은 이전에 열린된 힌트 파일에서 유효한 힌트가 상속 됩니다 의미 합니다.마지막 두 규칙 이전에 발생 한 힌트 검색 순서에서 나중에 발생 하는 힌트를 재정의할 수 있음을 의미 합니다.예를 들어, 원본 파일이 들어 있는 디렉터리에서 힌트 파일을 만드는 경우 이전의 모든 힌트를 재정의할 수 있습니다.

힌트 수집 방법에 대 한 설명은 참조는 예제 이 항목의 뒷부분에 나오는 섹션입니다.

구문

힌트를 만들고 동일한 구문의 매크로 삭제 하 고 만들 수 있는 전처리기 지시문을 삭제 합니다.실제로 구문 분석 시스템은 힌트를 평가 하는 C/c + + 전처리기를 사용 합니다.전처리기 지시문에 대 한 자세한 내용은 참조 하십시오. #define 지시문 (C/C++) 하 고 #undef 지시문 (C/C++).

만 전처리기 구문과 다른 구문 요소는 @<, @=를 하 고 @> 대체 문자열입니다.힌트 파일에만 사용 되는 고유한 대체 문자열로 가지 맵 매크로입니다.지도 데이터, 함수 또는 이벤트를 다른 데이터, 함수 또는 이벤트 처리기와 관련 된 매크로 집합입니다.예를 들어, MFC 맵을 사용 하 여 만들 수 메시지 맵를 하 고 ATL 맵을 사용 하 여 만들 수 개체 매핑.힌트 파일에는 고유한 대체 문자열로 맵의 시작, 중간 및 끝 요소를 나타냅니다.맵 매크로 이름만 유효입니다.따라서 각 대체 문자열은 의도적으로 매크로의 구현을 숨깁니다.

힌트는 다음 구문을 사용 합니다.

구문

의미

#define힌트 이름대체 문자열

#define힌트 이름(매개 변수, ...)대체 문자열

새 힌트를 정의 하거나 기존 힌트를 재정의 하는 전처리기 지시문입니다.각 지시문 뒤의 전처리기 대체 힌트 이름 소스 코드를 대체 문자열.

두 번째 구문 형태는 함수와 유사한 힌트를 정의합니다.함수와 유사한 힌트는 소스 코드에서 발생 하는 경우 첫 번째 전처리기 각 바꾸는 매개 변수 에서 대체 문자열 소스 코드 및 교체에 해당 인수를 힌트 이름 와 대체 문자열.

@<

힌트 파일 특정 대체 문자열 지도 요소 집합의 시작을 나타냅니다.

@=

힌트 파일 특정 대체 문자열 중간 맵 요소를 나타내는입니다.지도 맵 요소가 여러 개 있을 수 있습니다.

@>

힌트 파일 특정 대체 문자열 지도 요소 집합의 끝을 나타냅니다.

#undef힌트 이름

기존 힌트를 삭제 하는 전처리기 지시문입니다.힌트의 이름으로 제공 되는 힌트 이름 식별자입니다.

//주석

한 줄 주석입니다.

/*주석*/

여러 줄로 된 주석입니다.

어떤 힌트가 필요한 매크로?

특정 유형의 매크로 구문 분석 시스템을 방해할 수 있습니다.이 섹션에서는 문제를 일으킬 수 있는 매크로의 형식과 형식 힌트 해당 문제를 해결 하려면 만들 수 있습니다 설명 합니다.

방해가 되는 매크로

매크로 구문 분석 시스템에서 소스 코드를 잘못 해석 하지만 검색 환경을 망가뜨리지 않고 무시할 수 있습니다.소스 코드 주석 언어 (예를 들어,SAL) 매크로 프로그래밍 버그를 찾을 수 있도록 c + + 특성을 해결 합니다.코드를 탐색할 때 SAL 주석을 무시 하려면 주석을 숨기는 힌트 파일을 만들려면 원하는 수도 있습니다.

다음 소스 코드에서 매개 변수를 입력을 하면 FormatWindowClassName() 함수 PXSTR를 클릭 하 고 매개 변수 이름입니다 szBuffer.그러나, 구문 분석 하는 시스템 오류는 _Pre_notnull_ 하 고 _Post_z_ 매개 변수 이름이 나 매개 변수 형식에 대 한 SAL 주석이 있습니다.

소스 코드:

정적 void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR szBuffer)

전략: Null 정의

이러한 상황에서의 전략 사용 된 SAL 주석이 없는 것 처럼 처리 해야 합니다.이렇게 하려면 대체 문자열이 null 인 힌트를 지정 합니다.따라서, 주석을 구문 분석 시스템을 무시 하 고는 클래스 뷰 브라우저를 표시 하지 않습니다.(Visual C++ SAL 주석을 숨기는 기본 제공 힌트 파일이 포함 되어 있습니다.)

참고 파일:

#define _Pre_notnull_

숨겨진된 C/c + + 언어 요소

매크로 C/c + + 숨기기 구문 분석 시스템에서 소스 코드를 잘못 해석 하 게 되는 것은 일반적인 때문이입니다. 문장 부호 또는 키워드 토큰입니다.즉, 매크로 문장 부호 쌍 중 절반 같은 포함 될 수 있습니다. <>, [], {}를 하 고 ().

다음 소스 코드에서 해당 START_NAMESPACE 매크로 왼쪽된 중괄호가 짝이 없는 (숨깁니다.{).

소스 코드:

#define START_NAMESPACE MyProject 네임 스페이스 {

전략: 직접 복사

매크로의 의미 탐색 환경에 중요 한 경우에 매크로와 동일한 힌트를 만듭니다.구문 분석 시스템은 힌트 파일의 정의 매크로 확인합니다.

Note 이미 유효한 힌트 집합에 있는 경우에 매크로 소스 파일에서 다른 매크로가 포함 되어 있으면 해당 매크로 해석 됩니다.

참고 파일:

#define START_NAMESPACE MyProject 네임 스페이스 {

지도

지도의 시작 요소, 끝 요소 및 중간 요소를 0 개 이상 지정 하는 매크로 구성 됩니다.구문 분석 시스템에서는 각 맵 매크로가 C/c + + 언어 요소를 숨기는 전체 C/c + + 문의 구문이 서로 다른 많은 별도 매크로에 분산 되어 있기 때문에 지도 해석 합니다.

다음 소스 코드에 정의 된 BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY를 하 고 END_CATEGORY_MAP 매크로입니다.

소스 코드:

#define BEGIN_CATEGORY_MAP(x)\
static const struct ATL::_ATL_CATMAP_ENTRY* GetCategoryMap() throw() {\
static const struct ATL::_ATL_CATMAP_ENTRY pMap[] = {
#define IMPLEMENTED_CATEGORY( catid ) { _ATL_CATMAP_ENTRY_IMPLEMENTED, &catid },
#define END_CATEGORY_MAP()\
   { _ATL_CATMAP_ENTRY_END, NULL } };\
   return( pMap ); }

전략: 맵 요소 식별

힌트에는 시작, 중간 (있는 경우) 및 끝 지정 맵의 요소입니다.특수 한 맵 대체 문자열 사용 @<, @=를 하 고 @>.자세한 내용은 참조 하십시오 있는 구문 이 항목의 섹션입니다.

참고 파일:

// Start of the map.
#define BEGIN_CATEGORY_MAP(x) @<
// Intermediate map element.
#define IMPLEMENTED_CATEGORY( catid ) @=
// Intermediate map element.
#define REQUIRED_CATEGORY( catid ) @=
// End of the map.
#define END_CATEGORY_MAP() @>

복합 매크로

복합 매크로 구문 분석 시스템을 혼동 하는 매크로 형식이 하나 이상 들어 있습니다.

다음 소스 코드를 포함 하면 START_NAMESPACE 매크로 네임 스페이스 범위의 시작을 지정 하 고 BEGIN_CATEGORY_MAP 지도의 시작을 지정 하는 매크로

소스 코드:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

전략: 직접 복사

만들기에 대 한 힌트는 START_NAMESPACE 하 고 BEGIN_CATEGORY_MAP 매크로 만들고 다음 힌트는 NSandMAP 앞의 소스 코드에 표시 된 것 처럼 동일한 매크로입니다.또는 방해가 되는 매크로 및 공백으로 복합 매크로가 구성 하면 대체 문자열이 null 정의 인 힌트를 정의할 수 있습니다.

이 예제에서는 가정 START_NAMESPACE 힌트는이 항목에서 설명 하는 대로 이미 있는 숨겨진된 C/c + + 언어 요소 부제목이 있습니다.가정 하 고 BEGIN_CATEGORY_MAP 앞에서 설명한 것 처럼 힌트가 있습니다. 지도.

참고 파일:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

불편 한 매크로

일부 매크로 구문 분석 시스템에서 해석 될 수 있지만 소스 코드 또는 복잡 한 매크로 이기 때문에 읽기가 어렵습니다.가독성을 높이기 위해 표시 매크로를 단순화 하는 힌트를 제공할 수 있습니다.

소스 코드:

#define STDMETHOD(methodName) HRESULT (STDMETHODCALLTYPE * methodName)

전략: 단순화

간단한 매크로 정의 표시 하는 힌트를 만듭니다.

참고 파일:

#define STDMETHOD(methodName) void* methodName

예제

다음 예제에서는 힌트 힌트 파일의 누적 되는 방법을 보여 줍니다.중지 파일에이 예제에서는 사용 되지 않습니다.

다음 그림에서는 Visual C++ 프로젝트의 실제 디렉터리의 일부를 보여 줍니다.힌트 파일의 vcpackages, 디버그, A1를 하 고 A2 디렉터리입니다.

힌트 파일 디렉터리

일반 및 프로젝트별 힌트 파일 디렉터리

디렉터리 및 힌트 파일 내용

힌트 파일 및 힌트 파일의 내용이 포함 된 디렉터리에이 프로젝트는 다음 표입니다.일부에서 많은 힌트를 vcpackages 힌트 파일 디렉터리에 나열 됩니다.

디렉터리

힌트 파일 내용

vcpackages

// vcpackages (partial list)
#define _In_
#define _In_opt_
#define _In_z_
#define _In_opt_z_
#define _In_count_(size)

디버그

// Debug
#undef _In_
#define OBRACE {
#define CBRACE }
#define RAISE_EXCEPTION(x) throw (x)
#define START_NAMESPACE namespace MyProject {
#define END_NAMESPACE }

A1

// A1
#define START_NAMESPACE namespace A1Namespace {

A2

// A2
#undef OBRACE
#undef CBRACE

유효한 힌트

다음 표는이 프로젝트의 소스 파일에 대 한 유효한 힌트입니다.

원본 파일

유효한 힌트

A1_A2_B.cpp

// vcpackages (partial list)
#define _In_opt_
#define _In_z_
#define _In_opt_z_
#define _In_count_(size)
// Debug...
#define RAISE_EXCEPTION(x) throw (x)
// A1
#define START_NAMESPACE namespace A1Namespace { 
// ...Debug
#define END_NAMESPACE }

아래의 참고 앞의 표에 적용 됩니다.

  • 유효한 힌트가 되는 vcpackages, 디버그, A1를 하 고 A2 디렉터리입니다.

  • #undef 지시문에 디버그 힌트 파일 제거는 #define _In_ 힌트는 vcpackages 힌트 파일 디렉터리입니다.

  • 힌트 파일에는 A1 디렉터리를 다시 정의합니다. START_NAMESPACE.

  • 는 #undef 힌트는 A2 힌트에 대 한 디렉터리를 제거합니다. OBRACE 하 고 CBRACE 에 디버그 힌트 파일 디렉터리입니다.

참고 항목

참조

#define 지시문 (C/C++)

#undef 지시문 (C/C++)

메시지 맵(MFC)

개념

Visual C++ 프로젝트용으로 만들어지는 파일 형식

SAL 주석

기타 리소스

환경 창 만들기 및 제어

메시지 맵 매크로 (ATL)

개체 맵 매크로