使用预编译 headers 时如何覆盖单个单元的预处理器定义?
How to override preprocessor definition for a single unit when using precompiled headers?
初始问题:
我有一个由旧的调试 MSVCRT 库引起的错误。
它在 std::string
初始化的调试模式下抛出异常:
std::string str{vecBuff.cbegin(), vecBuff.cend()};
旧调试运行时库检测到 std::vector<char>::cend()
指向无效地址并导致有关 HEAP Courruption 的错误。它只发生在 MSI 自定义操作调用中(并且有一个我无能为力的旧运行时版本)。
在 this 答案的评论中有一个解决方案来设置 _ITERATOR_DEBUG_LEVEL 1
。
我不想为整个图书馆这样做。不幸的是,我也无法为单个 .cpp 做到这一点。
此 .cpp 使用预编译的 header 并在属性中为单个文件禁用它不会改变任何内容。我仍然收到关于 stdafx.h
missing.
的错误
// stdafx.h
#pragma once
#include <string>
// the .cpp file
// Can't include before. Get a lot of warnings.
#include "stdafx.h"
// will not have any effect since <string> is already included in "stdafx.h"
#if _MSC_VER && \
!__INTEL_COMPILER && \
_DEBUG
#define _ITERATOR_DEBUG_LEVEL 1
#endif
#include <string>
虽然我最初试图解决 std::string
初始化问题,但我想知道更通用主题的答案,因为在其他一些地方我可能需要自定义 preprocessof 定义和使用预编译的 header.
将 _ITERATOR_DEBUG_LEVEL
定义为 1 或 2 会更改迭代器的表示。而不是例如轻量级包装器指向容器数据的普通指针,使用此选项编译的迭代器包含指向数据的指针和指向容器代理对象的指针,后者包含有关容器的更多信息。因此,一些对象在 _ITERATOR_DEBUG_LEVEL
设置为 0 而另一些对象在 _ITERATOR_DEBUG_LEVEL
设置为其他内容的情况下编译的程序包含每个迭代器类型的两个不兼容版本。这不是一个好主意。因此,编译器会尝试检测不同调试级别的混合,如果发现不匹配,则故意引入链接器错误。即使您设法以某种方式禁止此检查,在使用不同 _ITERATOR_DEBUG_LEVEL
值编译的函数之间传递迭代器通常也是致命的。
初始问题:
我有一个由旧的调试 MSVCRT 库引起的错误。
它在 std::string
初始化的调试模式下抛出异常:
std::string str{vecBuff.cbegin(), vecBuff.cend()};
旧调试运行时库检测到 std::vector<char>::cend()
指向无效地址并导致有关 HEAP Courruption 的错误。它只发生在 MSI 自定义操作调用中(并且有一个我无能为力的旧运行时版本)。
在 this 答案的评论中有一个解决方案来设置 _ITERATOR_DEBUG_LEVEL 1
。
我不想为整个图书馆这样做。不幸的是,我也无法为单个 .cpp 做到这一点。
此 .cpp 使用预编译的 header 并在属性中为单个文件禁用它不会改变任何内容。我仍然收到关于 stdafx.h
missing.
// stdafx.h
#pragma once
#include <string>
// the .cpp file
// Can't include before. Get a lot of warnings.
#include "stdafx.h"
// will not have any effect since <string> is already included in "stdafx.h"
#if _MSC_VER && \
!__INTEL_COMPILER && \
_DEBUG
#define _ITERATOR_DEBUG_LEVEL 1
#endif
#include <string>
虽然我最初试图解决 std::string
初始化问题,但我想知道更通用主题的答案,因为在其他一些地方我可能需要自定义 preprocessof 定义和使用预编译的 header.
将 _ITERATOR_DEBUG_LEVEL
定义为 1 或 2 会更改迭代器的表示。而不是例如轻量级包装器指向容器数据的普通指针,使用此选项编译的迭代器包含指向数据的指针和指向容器代理对象的指针,后者包含有关容器的更多信息。因此,一些对象在 _ITERATOR_DEBUG_LEVEL
设置为 0 而另一些对象在 _ITERATOR_DEBUG_LEVEL
设置为其他内容的情况下编译的程序包含每个迭代器类型的两个不兼容版本。这不是一个好主意。因此,编译器会尝试检测不同调试级别的混合,如果发现不匹配,则故意引入链接器错误。即使您设法以某种方式禁止此检查,在使用不同 _ITERATOR_DEBUG_LEVEL
值编译的函数之间传递迭代器通常也是致命的。