Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.