Compartilhar via


/Zc:inline (remover COMDAT não referenciado)

Remove funções ou dados não referenciados que sejam COMDATs ou que tenham apenas vínculo interno. Em /Zc:inline, o compilador especifica que as unidades de tradução com dados ou funções embutidas também devem incluir suas definições.

Sintaxe

/Zc:inline[-]

Comentários

Quando /Zc:inline for especificado, o compilador não emitirá informações de símbolo para funções ou dados COMDAT não referenciados. Ou, para dados ou funções que têm apenas vinculação interna. Essa otimização simplifica parte do trabalho que o vinculador faz em compilações de versão ou quando você especifica a opção do vinculador /OPT:REF. Essa otimização do compilador pode reduzir significativamente o tamanho do arquivo .obj e aumentar as velocidades do vinculador. A opção do compilador não estará habilitada quando você desabilitar otimizações (/Od). Ou, quando você especificar /GL (Otimização de Programas Inteiros).

Por padrão, essa opção está desativada (/Zc:inline-) em builds de linha de comando. A opção /permissive- não habilita /Zc:inline. Em projetos do MSBuild, a opção é definida pelas Propriedades de configuração>C/C++>Linguagem de programação>Remover propriedade de dados e código não referenciados, que é definida como Sim por padrão.

Caso /Zc:inline seja especificado, o compilador impõe o requisito C++11 de que todas as funções declaradas inline deverão ter uma definição disponível na mesma unidade de tradução que são usadas. Quando a opção não é especificada, o compilador Microsoft permite o código em não conformidade que invoca as funções declaradas inline, mesmo que não haja uma definição visível. Para obter mais informações, consulte o padrão do C++11, nas seções 3.2 e 7.1.2. Essa opção do compilador foi introduzida no Visual Studio 2013 Atualização 2.

Para usar a opção /Zc:inline, atualize o código não que não está em conformidade.

Este exemplo mostra como o uso de não conformidade de uma declaração de função embutida sem uma definição ainda é compilada e vinculada quando a opção /Zc:inline- é usada:

Arquivo de origem 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() {};
};

Arquivo de origem 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
}

Arquivo de origem 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
}

Quando /Zc:inline é habilitado, o mesmo código causa um erro LNK2019, porque o compilador não emite um corpo de código não embutido para Example::inline_call em example.obj. O código ausente causa a chamada não embutida em main para referenciar um símbolo externo indefinido.

Para resolver esse erro, é possível remover a palavra-chave inline da declaração de Example::inline_call, ou mover a definição de Example::inline_call para o arquivo de cabeçalho, ou mover a implementação de Example para main.cpp. O próximo exemplo move a definição para o arquivo de cabeçalho, onde ele permanece visível para qualquer chamador com o cabeçalho.

Arquivo de origem 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() {};
};

Arquivo de origem 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();
}

Arquivo de origem 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
}

Para obter mais informações sobre problemas de conformidade no Visual C++, confira Comportamento fora do padrão.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Linguagem.

  3. Modifique a propriedade Remover código e dados não referenciados e escolha OK.

Confira também

/Zc (Conformidade)