/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
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.
Selecione a página de propriedades Propriedades da Configuração>C/C++>Linguagem.
Modifique a propriedade Remover código e dados não referenciados e escolha OK.