как #включить сторонний собственный заголовок C++, который использует nullptr, в проект C++/CLI

Я пытаюсь написать управляемую библиотеку C++ (также известную как C++/CLI), которая ссылается на стороннюю собственную библиотеку C++. Файлы заголовков сторонних библиотек содержат определения конструкторов, в которых используется ключевое слово nullptr. Мой управляемый проект не компилируется, потому что управляемый компилятор определяет nullptr как управляемую нулевую ссылку, тогда как сторонний использует его для обозначения собственного/неуправляемого нулевого указателя. Как обойти эту проблему, не изменяя заголовочный файл сторонней библиотеки?

Для справки о nullptr и __nullptr см.: https://msdn.microsoft.com/en-us/library/4ex65770.aspx


person Will Rogers    schedule 04.03.2016    source источник
comment
У тебя хороший ответ. Приручение ваших #includes очень важно, стремление свести к минимуму воздействие всегда важно, когда вы взаимодействуете с чужим кодом. Просто #define _ALLOW_KEYWORD_MACROS   -  person Hans Passant    schedule 05.03.2016


Ответы (1)


C++/CLI поддерживает те же директивы препроцессора, что и C++, верно? Как насчет этого ужасного хака:

#define _ALLOW_KEYWORD_MACROS
#define nullptr __nullptr
#include "header.h"
#undef nullptr
person Matti Virkkunen    schedule 04.03.2016
comment
Я должен был упомянуть; коллега уже предлагал это, но это не работает: #error: The C++ Standard Library forbids macroizing keywords. - person Will Rogers; 05.03.2016
comment
...по-видимому, есть способ отключить эти ошибки. Хотя не совсем уверен, что это хорошая идея. - person Matti Virkkunen; 05.03.2016
comment
Ну, не уверен, что можно обвинить Microsoft в этой проблеме. Это тот злобный комитет ISO, который добавил в C++11 так много ключевых слов, которые уже использовались в C++/CLI. Например, nullptr, enum class, override, final. У пионеров стрелы в спину. - person Hans Passant; 05.03.2016
comment
@Matti, вы должны просто добавить #define _ALLOW_KEYWORD_MACROS, поскольку Ганс прокомментировал вопрос (я говорю это здесь, потому что вы, вероятно, не заметите этого в вопросе). - person Lucas Trzesniewski; 05.03.2016
comment
@HansPassant Если бы C++/CLI был C++, а это значит, что он не меняет значения совершенно корректного кода, например, путем добавления ключевых слов и т.п., не было бы никаких проблем. (И единственный другой из этого списка, который может иметь другое значение в C++, чем в C++/CLI, это enum class, насколько я знаю... - person Deduplicator; 05.03.2016
comment
Спасибо. Кажется, это работает. Похоже, вы тоже можете #undef _ALLOW_KEYWORD_MACROS потом, хотя я не уверен в точной семантике этого. - person Will Rogers; 07.03.2016