Share via


/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.objExample::inline_call 내보내지 않으므로 동일한 코드로 인해 LNK2019 오류가 발생합니다. 누락된 코드로 인해 인라인되지 않은 호출이 main 정의되지 않은 외부 기호를 참조하게 됩니다.

이 오류를 해결하려면 선언Example::inline_call에서 키워드(keyword) 제거 inline 하거나 정의를 Example::inline_call 헤더 파일로 이동하거나 구현 Examplemain.cpp을 이동합니다. 다음 예제에서는 헤더를 포함하는 모든 호출자에게 표시되는 헤더 파일로 정의를 이동합니다.

원본 파일 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 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>Language 속성 페이지를 선택합니다.

  3. 참조되지 않은 코드 및 데이터 속성 제거를 수정한 다음 확인을 선택합니다.

참고 항목

/Zc (규칙)