/Zc:inline (Supprimer COMDAT non référencé)

Supprime les données ou fonctions non référencées qui sont des COMDAT ou qui ont uniquement une liaison interne. Sous /Zc:inline, le compilateur spécifie que les unités de traduction avec des données ou fonctions inline doivent également inclure leurs définitions.

Syntaxe

/Zc:inline[-]

Notes

Lorsqu’il /Zc:inline est spécifié, le compilateur n’émet pas d’informations de symboles pour les fonctions ou données COMDAT non référencées. Ou, pour les données ou les fonctions qui ont uniquement une liaison interne. Cette optimisation simplifie le travail que l’éditeur de liens effectue dans les builds de mise en production ou lorsque vous spécifiez l’option /OPT:REF éditeur de liens. Cette optimisation du compilateur peut réduire considérablement .obj taille de fichier et améliorer les vitesses de l’éditeur de liens. L’option du compilateur n’est pas activée lorsque vous désactivez les optimisations (/Od). Ou, lorsque vous spécifiez /GL (Optimisation du programme entier).

Par défaut, cette option est désactivée (/Zc:inline-) dans les builds de ligne de commande. L’option /permissive- n’active pas /Zc:inline. Dans les projets MSBuild, l’option est définie par les propriétés>de configuration C/C++>Language>Remove sans référence et la propriété de données, qui est définie sur Oui par défaut.

Si /Zc:inline elle est spécifiée, le compilateur applique la condition C++11 que toutes les fonctions déclarées inline doivent avoir une définition disponible dans la même unité de traduction si elles sont utilisées. Lorsque l’option n’est pas spécifiée, le compilateur Microsoft autorise le code non conforme qui appelle des fonctions déclarées inline même si aucune définition n’est visible. Pour plus d'informations, voir la norme C++11, section 3.2 et section 7.1.2. Cette option du compilateur a été introduite pour la première fois dans Visual Studio 2013 Update 2.

Pour utiliser l’option /Zc:inline , mettez à jour le code non conforme.

Cet exemple montre comment l’utilisation non conforme d’une déclaration de fonction inline sans définition compile et lie toujours lorsque l’option par défaut /Zc:inline- est utilisée :

Fichier source 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() {};
};

Fichier source 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
}

Fichier source 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
}

Lorsqu’il /Zc:inline est activé, le même code provoque une erreur LNK2019 , car le compilateur n’émet pas de corps de code non incorporé dans Example::inline_call example.obj. Le code manquant provoque l’appel non inclus dans main la référence à un symbole externe non défini.

Pour résoudre cette erreur, vous pouvez supprimer le inline mot clé de la déclaration de Example::inline_call, ou déplacer la définition du Example::inline_call fichier d’en-tête, ou déplacer l’implémentation de Example main.cpp. L’exemple suivant déplace la définition dans le fichier d’en-tête, où elle est visible par n’importe quel appelant qui inclut l’en-tête.

Fichier source 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() {};
};

Fichier source 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();
}

Fichier source 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
}

Pour plus d’informations sur les problèmes de conformité dans Visual C++, consultez comportement non standard.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Langage.

  3. Modifiez le code et la propriété de données non référencés, puis choisissez OK.

Voir aussi

/Zc (Conformité)