Compartir vía


/Zc:inline (Quitar COMDAT no referenciada)

Quita los datos o las funciones a los que no se hace referencia y que son COMDAT o que solo tienen vinculación interna. En /Zc:inline, el compilador especifica que las unidades de traducción con funciones o datos insertados también deben incluir sus definiciones.

Sintaxis

/Zc:inline[-]

Comentarios

Cuando se especifica /Zc:inline, el compilador no emite información de símbolos para funciones o datos COMDAT no referenciados. O bien, para datos o funciones que solo tienen vinculación interna. Esta optimización simplifica parte del trabajo que realiza el enlazador en las versiones de lanzamiento o cuando especifica la opción del enlazador /OPT:REF. La optimización del compilador puede reducir significativamente el tamaño del archivo .obj y mejorar la velocidad del enlazador. La opción del compilador no está habilitada cuando se deshabilitan las optimizaciones (/Od). O bien, cuando se especifica /GL (Optimización de todo el programa).

De forma predeterminada, esta opción está desactivada (/Zc:inline-) en compilaciones de línea de comandos. La opción /permissive- no habilita /Zc:inline. En los proyectos de MSBuild, la opción se establece mediante la propiedad Propiedades de configuración>C/C++>Lenguaje>Quitar código y datos a los que no se hace referencia, que se establece en de forma predeterminada.

Si se especifica /Zc:inline, el compilador exige el requisito de C++11 que dicta que todas las funciones declaradas inline deben tener una definición disponible en la misma unidad de traducción si se usan. Cuando no se especifica esta opción, el compilador de Microsoft permite el código que no cumple este requisito y que invoca funciones declaradas inline aunque no haya ninguna definición visible. Para más información, consulte las secciones 3.2 y 7.1.2 del estándar C++11. Esta opción del compilador se introdujo en Visual Studio 2013 Update 2.

Para usar la opción /Zc:inline, actualice el código que no cumple los requisitos.

En este ejemplo se muestra cómo, al usar una declaración de función alineada sin definición que no cumple los requisitos, esta se compila y se vincula de todas formas si se usa la opción predeterminada /Zc:inline-:

Archivo de origen 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() {};
};

Archivo de origen 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
}

Archivo de origen 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
}

Cuando /Zc:inline está habilitado, el mismo código provoca un error LNK2019, porque el compilador no emite un cuerpo de código no alineado para Example::inline_call en example.obj. El código que falta hace que la llamada no alineada de main haga referencia a un símbolo externo sin definir.

Para resolver este error, puede quitar la palabra clave inline de la declaración de Example::inline_call o mover la definición de Example::inline_call al archivo de encabezado o mover la implementación de Example a main.cpp. En el ejemplo siguiente, la definición se mueve al archivo de encabezado, donde estará visible para todos los autores de llamadas que incluyan el encabezado.

Archivo de origen 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() {};
};

Archivo de origen 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();
}

Archivo de origen 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 obtener más información sobre los problemas de conformidad de Visual C++, vea Nonstandard Behavior.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Lenguaje.

  3. Modifique la propiedad Quitar código y datos no referenciados y, después, elija Aceptar.

Consulte también

/Zc (Conformidad)