스마트 장치 프로젝트의 컴파일러
업데이트: 2007년 11월
Visual Studio에는 스마트 장치에서 사용되는 마이크로프로세서를 대상으로 하는 다음과 같은 컴파일러가 포함되어 있습니다.
32비트 ARM C 및 C++ 프로그램의 컴파일과 링크에 사용되는 32비트 C/C++ 컴파일러
32비트 Renesas SH-4 C 및 C++ 프로그램의 컴파일과 링크에 사용되는 32비트 C/C++ 컴파일러
MIPS16, MIPS32, MIPS64 C 및 C++ 프로그램의 컴파일과 링크에 사용되는 C/C++ 컴파일러
컴파일러는 COFF(Common Object File Format) 개체 파일을 생성합니다. 컴파일러 프로그램은 각 소스 파일을 컴파일하며, 따로 지정되어 있지 않은 경우 컴파일할 때마다 개체 파일도 컴파일합니다. 컴파일러에는 CL(명령줄)의 CL 환경 변수에 나열된 옵션과 지정된 지시 파일이 포함되어 있습니다.
데스크톱과 장치 간 Visual Studio 컴파일러 차이점
차이점 |
설명 |
---|---|
고급 탭, 컴파일 대상 아키텍처 드롭다운 목록 |
장치 프로젝트의 프로젝트 속성에서 C/C++ 노드 아래에 있는 고급 탭의 컴파일 대상 아키텍처 드롭다운 목록에서는 Arm4 (/QRarch4), ARM5 (/QRarch5), Arm4t (/QRarch4t), ARM5t (/QRarch5t) 중 하나를 선택할 수 있습니다. |
고급 탭, ARM 및 ARM THUMB 호출 상호 연동 드롭다운 목록 |
장치 프로젝트의 프로젝트 속성에서 C/C++ 노드 아래에 있는 고급 탭의 ARM 및 ARM THUMB 호출 상호 연동 드롭다운 목록에서는 예(/QRInterwork-return)와 아니요 중 하나를 선택할 수 있습니다. 예로 설정하면 컴파일러가 16비트 및 32비트 ARM 코드에서 상호 연동할 수 있는 썽킹 코드를 생성합니다. |
고급 탭, 부동 소수점 에뮬레이션 사용 드롭다운 목록 |
장치 프로젝트의 프로젝트 속성에서 C/C++ 노드 아래에 있는 고급 탭의 부동 소수점 에뮬레이션 사용 드롭다운 목록에서는 예와 아니요 중 하나를 선택할 수 있습니다. 예로 설정하면 컴파일러에서 부동 소수점 연산 에뮬레이션을 사용하도록 설정합니다. |
전처리기 탭, 전처리기정의 입력 상자 |
장치 프로젝트의 프로젝트 속성에서 C/C++ 노드 아래에 있는 전처리기 탭의 전처리기정의 입력 상자에는 부모 또는 프로젝트 기본값에서 상속 확인란과 매크로 추가를 위한 매크로 단추가 있습니다. |
최적화 탭, 부동 소수점 일치정의 드롭다운 목록 |
장치 프로젝트의 프로젝트 속성에서 C/C++ 노드 아래에 있는 최적화 탭의 부동 소수점 일치정의 드롭다운 목록에서는 기본 일관성이나 일관성 향상(/Op) 중 하나를 선택할 수 있습니다. |
자세한 내용은 컴파일러 옵션 사전순 목록을 참조하십시오.
이전 버전 Visual Studio에서 변경된 내용
Visual Studio 2003과 Visual Studio 2005 간 컴파일러 변경 내용
장치 컴파일러는 데스크톱 컴퓨터 Visual C++ 컴파일러를 기반으로 하므로 데스크톱 컴파일러의 버전 간 차이점을 확인하면 eMbedded Visual C++ 장치 컴파일러와 Visual Studio 2005 장치 컴파일러 간의 변경 내용을 쉽게 알 수 있습니다. Visual Studio 6.0과 Visual Studio 2003 간의 변경 내용에 대한 자세한 내용은 Compatibility and Compliance Issues in Visual C++를 참조하십시오.
다음 표에서는 Visual Studio 2003과 Visual Studio 2005 간 컴파일러 변경 내용을 요약하여 설명합니다.
문제 |
설명 |
---|---|
멤버에 대한 포인터에는 이제 함수를 호출할 때 괄호, 정규화된 이름 및 주소 연산자(&)가 필요합니다. |
메서드 이름만 사용하는 이전 버전의 컴파일러용으로 작성된 코드의 경우 컴파일러 오류 C3867이나 컴파일러 경고 C4867이 발생합니다. 이러한 진단은 ISO C++ 표준에서 요구하는 사항입니다. 멤버 함수에 대한 포인터를 만들려면 주소 연산자(&)와 정규화된 메서드 이름을 사용해야 합니다. & 연산자와 정규화된 메서드 이름이 필요하지 않거나 함수 호출 시 괄호가 누락되면 오류가 발생할 수 있습니다. 인수 목록 없이 함수 이름을 사용하면 여러 형식으로 변환될 수 있는 함수 포인터가 나타납니다. 따라서 이러한 코드를 사용하면 런타임에 예기치 않은 동작이 발생할 수 있습니다. |
friend 선언에서 클래스에 액세스할 수 있어야 합니다. |
이전 Visual C++ 컴파일러에서는 선언이 포함된 클래스 범위에서 액세스할 수 없는 클래스에 friend 선언을 사용할 수 있었습니다. Visual C++ 2005에서는 이러한 경우 컴파일러 오류 C2248이 발생합니다. 이 오류를 해결하려면 friend 선언에 지정된 클래스의 액세스 가능성을 변경하십시오. ISO C++ 표준을 따르도록 이렇게 변경되었습니다. |
명시적 특수화를 복사 생성자나 복사 할당 연산자로 사용할 수 없습니다. |
이제 복사 생성자나 복사 할당 연산자에 대한 명시적 템플릿 특수화에 따라 달라지는 코드를 사용하면 컴파일러 오류 C2299가 발생하며 ISO C++ 표준에서는 이를 허용하지 않습니다. 코드 이식성 향상을 위해 표준을 따르도록 이와 같이 변경되었습니다. |
특수화되지 않은 클래스 템플릿은 기본 클래스 목록에서 템플릿 인수로 사용할 수 없습니다. |
기본 클래스 목록에서 특수화되지 않은 템플릿 클래스 이름을 클래스 정의에 사용하면 컴파일러 오류 C3203이 발생합니다. 특수화되지 않은 템플릿 클래스 이름은 기본 클래스 목록에서 템플릿 매개 변수로 사용할 수 없습니다. 특수화되지 않은 템플릿 클래스 이름을 기본 클래스 목록에서 템플릿 매개 변수로 사용할 때는 템플릿 클래스 이름에 템플릿 형식 매개 변수를 명시적으로 추가해야 합니다. 규칙을 따르고 코드 이식성을 향상시키기 위해 이렇게 변경되었습니다. |
이제 중첩 형식의 선언을 사용할 수 없습니다. |
이제 중첩 형식의 선언이 있는 코드를 사용하면 컴파일러 오류 C2885가 발생합니다. 이 오류를 해결하려면 중첩 형식에 대한 참조를 정규화하거나 네임스페이스에 형식을 배치하거나 typedef를 만들어야 합니다. 코드 이식성 향상을 위해 표준을 따르도록 이와 같이 변경되었습니다. |
/YX 컴파일러 옵션이 제거되었습니다. |
/YX 컴파일러 옵션은 미리 컴파일된 헤더 자동 지원을 생성했으며 개발 환경에서 기본적으로 사용되었습니다. 빌드 구성에서 /YX컴파일러 옵션을 제거하면 빌드 속도가 빨라집니다. /YX 컴파일러 옵션을 사용하면 성능 문제뿐 아니라 예기치 않은 런타임 동작이 발생할 수 있습니다. /Yc(미리 컴파일된 헤더 파일 만들기)와 /Yu(미리 컴파일된 헤더 파일 사용)를 사용하여 미리 컴파일된 헤더가 사용되는 방법을 세부적으로 제어하는 것이 좋습니다. |
/Oa 및 /Ow 컴파일러 옵션이 제거되었습니다. |
/Oa 및 /Ow 컴파일러 옵션은 제거되었으므로 무시됩니다. 컴파일러가 별칭을 설정하는 방식을 지정하는 데는 noalias 또는 restrictdeclspec 한정자를 사용합니다. |
/Op 컴파일러 옵션이 제거되었습니다. |
/Op컴파일러 옵션은 제거되었습니다. /fp:precise를 대신 사용할 수 있습니다. |
/ML 및 /MLd컴파일러 옵션이 제거되었습니다. |
이제 Visual C++ 2005에서는 정적으로 링크된 단일 스레드 CRT 라이브러리 지원을 제공하지 않습니다. /MT와 /MTd를 대신 사용할 수 있습니다. |
/G3, /G4, /G5, /G6, /G7 및 /GB컴파일러 옵션이 제거되었습니다. |
컴파일러에서는 이제 모든 아키텍처에 대한 최상의 출력 파일을 만들기 위해 복합 모델을 사용합니다. |
/Gf 컴파일러 옵션이 제거되었습니다. |
/GF를 대신 사용할 수 있습니다. /GF는 풀링된 문자열을 읽기 전용 섹션에 넣습니다. 읽기 전용 섹션은 /Gf가 해당 문자열을 추가한 쓰기 가능 섹션보다 안전합니다. |
이제 /GS 컴파일러 옵션이 기본적으로 설정됩니다. |
이제 버퍼 오버플로 검사가 기본적으로 설정됩니다. /GS-를 사용하여 버퍼 오버런 검사를 해제할 수 있습니다. |
이제 /Zc:wchar_t 변수가 기본적으로 설정됩니다. |
wchar_t 변수는 short unsigned 정수 대신 기본 제공 형식을 기본값으로 사용하는데 이것은 ISO C++ 표준 동작입니다. 이러한 변경 때문에 /Zc:wchar_t 없이 컴파일된 라이브러리에 클라이언트 코드를 링크하면 이진 호환성이 유지되지 않습니다. /Zc:wchar_t-를 사용하여 이전의 비표준 동작으로 되돌릴 수도 있습니다. 기본적으로 호환되는 코드가 만들어지도록 이렇게 변경된 것입니다. |
이제 /Zc:forScope 변수가 기본적으로 설정됩니다. |
이제 for 루프 범위가 끝난 후 for 루프에 선언된 변수의 사용에 따라 달라지는 코드는 컴파일할 수 없는데 이것은 ISO C++ 표준 동작입니다. /Zc:forScope를 사용하여 이전의 비표준 동작으로 되돌릴 수도 있습니다. 기본적으로 호환되는 코드가 만들어지도록 이렇게 변경된 것입니다. |
Visual C++ 특성에 매개 변수 검사를 적용합니다. |
명명된 특성을 특성 생성자에 전달할 때 형식이 문자열이 아닐 경우 따옴표로 묶어 전달하고 형식이 문자열일 경우에는 따옴표 없이 전달하는 코드를 사용하면 이제 컴파일러 오류 C2065 또는 컴파일러 경고(수준 1) C4581이 발생합니다. 이전에는 모든 컴파일러 특성이 문자열로 구문 분석되었으며, 필요한 경우 누락된 따옴표를 컴파일러에서 자동으로 삽입했습니다. 이제 매개 변수 유효성 검사 기능이 추가되어 특성 지원이 향상되었습니다. 따라서 특성 생성자에 잘못된 인수가 전달되는 경우에 발생하는 예기치 않은 동작을 방지할 수 있습니다. |
컴파일러가 선언에 int 형식을 기본 형식으로 삽입하지 않습니다. |
이제 선언에 형식이 없는 코드가 int 형식으로 기본 설정되지 않습니다. 선언에 형식이 없는 코드를 사용하면 컴파일러에서 컴파일러 경고 C4430이나 컴파일러 경고(수준 4) C4431이 발생합니다. ISO C++ 표준에서는 기본 int를 지원하지 않으며 이러한 변경 때문에 명시적으로 지정한 형식을 가져올 수 있습니다. |
자세한 내용은 Visual C++ 2005 컴파일러의 주요 변경 사항을 참조하십시오.