/Zc:inline (remover COMDAT não referenciado)
Remove funções não referenciadas ou dados que sejam COMDATs ou que tenham apenas vínculo interno. Quando /Zc:inline é especificado, o compilador exige que as unidades de tradução que usam dados ou funções embutidos também incluam as definições dos dados ou das funções.
/Zc:inline[-]
Comentários
Quando /Zc:inline é especificado, o compilador não emite informações do símbolo para funções ou dados COMDAT não referenciados, ou para funções ou dados que tenham apenas vínculo interno. Por padrão, essa opção permanece desativada (/Zc:inline-). Essa otimização simplifica parte do trabalho realizado pelo vinculador em compilações de versão ou quando a opção do vinculador /OPT:REF é especificada. Ao realizar essa otimização, o compilador pode reduzir significativamente o tamanho do arquivo .obj e aumentar as velocidades do vinculador. Essa opção do compilador não permanece habilitada quando as otimizações estão desabilitadas (/Od) ou quando /GL (otimização de todo o programa) é especificado.
Caso /Zc:inline seja especificado, o compilador impõe o requisito C++11 de que, se forem usadas, todas as funções declaradas inline deverão ter uma definição disponível na mesma unidade de tradução. Quando a opção não é especificada, o Visual C++ 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 compatível. Este exemplo mostra como o uso não compatível de uma declaração de função embutida sem uma definição ainda é compilada e vinculada quando a opção /Zc:inline- é usada:
// 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
// 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
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include "example.h"
void 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. Isso faz a chamada não embutida em main mencionar um símbolo externo indefinido.
Para resolver esse erro, é possível remover a palavra-chave inline da declaração de Example::inline_call, 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.
// 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
// 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.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
void main() {
Example2 example2;
example2.inline_call(); // normal call when definition unavailable
}
Para obter mais informações sobre problemas de conformidade no Visual C++, consulte Comportamento não 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, consulte Trabalhando com propriedades do projeto.
Selecione a pasta C/C++.
Selecione a página de propriedades de Linha de Comando.
Modifique a propriedade Opções Adicionais para incluir /Zc:inline e escolha OK.