Share via


/Zc:inline (Remove unreferenced COMDAT)

Rimuove i dati o le funzioni non referenziati che sono COMDAT o che hanno solo un collegamento interno. In /Zc:inlineil compilatore specifica che anche le unità di conversione con dati o funzioni inline devono includere le relative definizioni.

Sintassi

/Zc:inline[-]

Osservazioni:

Quando /Zc:inline viene specificato, il compilatore non genera informazioni sui simboli per funzioni o dati COMDAT non referenziati. In alternativa, per i dati o le funzioni che dispongono solo di collegamenti interni. Questa ottimizzazione semplifica alcune operazioni che il linker esegue nelle build di versione o quando si specifica l'opzione /OPT:REF del linker. Questa ottimizzazione del compilatore può ridurre significativamente le dimensioni del file obj e migliorare la velocità del linker. L'opzione del compilatore non è abilitata quando si disabilitano le ottimizzazioni (/Od). In alternativa, quando si specifica /GL (Ottimizzazione intero programma) .

Per impostazione predefinita, questa opzione è disattivata (/Zc:inline-) nelle compilazioni della riga di comando. L'opzione /permissive- non abilita /Zc:inline. Nei progetti MSBuild l'opzione è impostata dalla proprietà di>configurazione C/C++>Language>Remove unreferenced code and data (Rimuovi codice e dati senza riferimenti) impostata su per impostazione predefinita.

Se /Zc:inline viene specificato, il compilatore applica il requisito C++11 che tutte le funzioni dichiarate inline devono avere una definizione disponibile nella stessa unità di conversione se vengono usate. Quando l'opzione non è specificata, il compilatore Microsoft consente codice non conforme che richiama funzioni dichiarate inline anche se non è visibile alcuna definizione. Per altre informazioni, vedere lo standard C++11 nelle sezioni 3.2 e 7.1.2. Questa opzione del compilatore è stata introdotta in Visual Studio 2013 Update 2.

Per usare l'opzione /Zc:inline , aggiornare il codice non conforme.

In questo esempio viene illustrato come l'uso non conforme di una dichiarazione di funzione inline senza una definizione venga ancora compilato e i collegamenti quando viene usata l'opzione predefinita /Zc:inline- :

example.hFile di origine :

// 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.cppFile di origine :

// 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.cppFile di origine :

// 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 è abilitato, lo stesso codice genera un errore LNK2019 , perché il compilatore non genera un corpo del codice non inlined per Example::inline_call in example.obj. Il codice mancante fa sì che la chiamata non inlined in in main faccia faccia riferimento a un simbolo esterno non definito.

Per risolvere questo errore, è possibile rimuovere la inline parola chiave dalla dichiarazione di Example::inline_calloppure spostare la definizione di nel file di Example::inline_call intestazione oppure spostare l'implementazione di Example in main.cpp. Nell'esempio seguente la definizione viene spostata nel file di intestazione, in cui è visibile a qualsiasi chiamante che include l'intestazione.

example2.hFile di origine :

// 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.cppFile di origine :

// 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.hFile di origine :

// 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
}

Per altre informazioni sui problemi di conformità in Visual C++, vedere Comportamento non standard.

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Language.

  3. Modificare la proprietà Rimuovi codice e dati senza riferimenti e quindi scegliere OK.

Vedi anche

/Zc (Conformità)