es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo anular la definición del preprocesador para una unidad individual al utilizar encabezados precompilados?

Problema inicial:
Tengo un error causado por una antigua biblioteca de depuración de MSVCRT.
Lanza una excepción en modo de depuración para la inicialización de std::string:

std::string str{vecBuff.cbegin(), vecBuff.cend()};

La antigua biblioteca de tiempo de ejecución de depuración detecta que std::vector<char>::cend() apunta a una dirección no válida y provoca un error de CORRUPCIÓN de la memoria. Solo ocurre dentro de una invocación de Acción Personalizada MSI (y hay una versión antigua de tiempo de ejecución sobre la cual no puedo hacer nada).

En los comentarios de esta respuesta hay una solución para establecer _ITERATOR_DEBUG_LEVEL 1.
No quiero hacer eso para toda la biblioteca. Desafortunadamente, tampoco puedo hacerlo para un solo archivo .cpp.
Este .cpp utiliza un encabezado precompilado y deshabilitarlos para un solo archivo en las propiedades no cambia nada. Todavía obtengo un error acerca de la falta de stdafx.h.

// stdafx.h

<h1>#pragma once</h1>

<h1>#include <string></h1>

// el archivo .cpp

// No puedo incluir antes. Obtengo muchas advertencias.

<h1>#include "stdafx.h"</h1>

// no tendrá efecto ya que <string> ya está incluido en "stdafx.h"

<h1>#if <em>MSC</em>VER && \</h1>

<pre><code>!__INTEL_COMPILER && \
_DEBUG
</code></pre>

<h1>#define <em>ITERATOR</em>DEBUG_LEVEL 1</h1>

<h1>#endif</h1>

<h1>#include <string></h1>

Aunque inicialmente estoy tratando de resolver el problema de la inicialización de std::string, me gustaría conocer la respuesta a un tema más genérico, ya que hay otros lugares donde podría necesitar personalizar las definiciones del preprocesador y utilizar un encabezado precompilado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Puede usar la compilación condicional para establecer _ITERATOR_DEBUG_LEVEL solo para el código problemático.

    En primer lugar, cree un nuevo archivo de encabezado (llamémoslo debug_config.h) con el siguiente contenido:

    “`c++
    #if _MSC_VER && \
    !__INTEL_COMPILER && \
    _DEBUG
    #define _ITERATOR_DEBUG_LEVEL 1
    #else
    #define _ITERATOR_DEBUG_LEVEL 0
    #endif


    Ahora, en su archivo `.cpp`, incluya este encabezado antes que cualquier otro encabezado que desee personalizar: ```c++ #include "debug_config.h" #include "stdafx.h" #include <string>

    De esta manera, _ITERATOR_DEBUG_LEVEL se establecerá en 1 solo cuando esté definido _DEBUG y el compilador sea MSVC, y el preprocesador se comportará como de costumbre cuando no se cumpla la condición.

    Tenga en cuenta que esta solución asume que el archivo de encabezado precompilado stdafx.h no define _ITERATOR_DEBUG_LEVEL. Si lo hace, deberá incluir debug_config.h antes de stdafx.h y esperar que el archivo de encabezado precompilado no entre en conflicto con su configuración.

    ¡Espero que esto ayude!

Comments are closed.