/Zc:inline
(참조되지 않은 COMDAT 제거)
COMDAT이거나 내부 링크만 있는 참조되지 않은 데이터 또는 함수를 제거합니다. 아래에서 /Zc:inline
컴파일러는 인라인 데이터 또는 함수가 있는 번역 단위에도 해당 정의를 포함하도록 지정합니다.
구문
/Zc:inline
[-
]
설명
지정된 경우 /Zc:inline
컴파일러는 참조되지 않은 COMDAT 함수 또는 데이터에 대한 기호 정보를 내보내지 않습니다. 또는 내부 링크만 있는 데이터 또는 함수의 경우 이 최적화는 링커가 릴리스 빌드에서 수행하거나 링커 옵션을 지정할 /OPT:REF
때 수행하는 일부 작업을 간소화합니다. 이 컴파일러 최적화는 .obj 파일 크기를 크게 줄이고 링커 속도를 향상시킬 수 있습니다. 최적화(/Od
)를 사용하지 않도록 설정하면 컴파일러 옵션을 사용할 수 없습니다. 또는 지정 /GL
하는 경우(전체 프로그램 최적화)
기본적으로 이 옵션은 명령줄 빌드에서 꺼져 있습니다(/Zc:inline-
). /permissive-
옵션은 /Zc:inline
을 사용하도록 설정하지 않습니다. MSBuild 프로젝트에서 옵션은 기본적으로 Yes로 설정된 구성 속성>C/C++>Language>Remove 참조되지 않은 코드 및 데이터 속성에 의해 설정됩니다.
지정된 경우 /Zc:inline
컴파일러는 선언 inline
된 모든 함수에 사용되는 경우 동일한 변환 단위에서 사용할 수 있는 정의가 있어야 한다는 C++11 요구 사항을 적용합니다. 옵션을 지정하지 않으면 Microsoft 컴파일러는 정의가 표시되지 않더라도 선언된 inline
함수를 호출하는 비준수 코드를 허용합니다. 자세한 내용은 섹션 3.2 및 7.1.2에서 C++11 표준을 참조하세요. 이 컴파일러 옵션은 Visual Studio 2013 업데이트 2에서 정의되었습니다.
이 /Zc:inline
옵션을 사용하려면 비준수 코드를 업데이트합니다.
이 예제에서는 기본 /Zc:inline-
옵션을 사용할 때 정의가 없는 인라인 함수 선언의 비규격 사용이 여전히 컴파일되고 링크되는 방법을 보여 주는 예제입니다.
원본 파일 example.h
:
// example.h
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#pragma once
class Example {
public:
inline void inline_call(); // declared but not defined inline
void normal_call();
Example() {};
};
원본 파일 example.cpp
:
// example.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include <stdio.h>
#include "example.h"
void Example::inline_call() {
printf("inline_call was called.\n");
}
void Example::normal_call() {
printf("normal_call was called.\n");
inline_call(); // with /Zc:inline-, inline_call forced into .obj file
}
원본 파일 zcinline.cpp
:
// zcinline.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include "example.h"
int main() {
Example example;
example.inline_call(); // normal call when definition unavailable
}
사용하도록 설정하면 /Zc:inline
컴파일러가 인라인되지 않은 코드 본문을 example.obj
Example::inline_call
내보내지 않으므로 동일한 코드로 인해 LNK2019 오류가 발생합니다. 누락된 코드로 인해 인라인되지 않은 호출이 main
정의되지 않은 외부 기호를 참조하게 됩니다.
이 오류를 해결하려면 선언에서 키워드를 inline
제거하거나 정의를 Example::inline_call
헤더 파일로 이동하거나 구현 Example
을 이동합니다main.cpp
.Example::inline_call
다음 예제에서는 헤더를 포함하는 모든 호출자에게 표시되는 헤더 파일로 정의를 이동합니다.
원본 파일 example2.h
:
// example2.h
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#pragma once
#include <stdio.h>
class Example2 {
public:
inline void inline_call() {
printf("inline_call was called.\n");
}
void normal_call();
Example2() {};
};
원본 파일 example2.cpp
:
// example2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
void Example2::normal_call() {
printf("normal_call was called.\n");
inline_call();
}
원본 파일 zcinline2.h
:
// zcinline2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
int main() {
Example2 example2;
example2.inline_call(); // normal call when definition unavailable
}
Visual C++의 규칙 문제에 대한 자세한 내용은 비표준 동작을 참조하세요.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.
구성 속성>C/C++>언어 속성 페이지를 선택합니다.
참조되지 않은 코드 및 데이터 속성 제거를 수정한 다음 확인을 선택합니다.