Я хотел бы, чтобы мой код компилировался как на устаревшем C ++ (код C ++ с использованием «NULL»), так и на новом стандарте C ++ 11 (код C ++ с использованием «nullptr»)
Я использую GCC, но планирую перекомпилировать всю кодовую базу также для VS, когда я закончу самые важные вещи.
Стоит ли ожидать, что и GCC, и VS будут делать что-то вроде
#define NULL nullptr
Или лучше я сделаю это сам (используя, конечно, другое имя, где MY_LIB будет заменен моим суффиксом библиотеки)?
#ifndef nullptr
#define MY_LIB_NULL NULL
#else
#define MY_LIB_NULL nullptr
#endif
Чего я хочу добиться, так это кода, который компилируется независимо от того, были ли реализованы функции C ++ 11 или нет (и поскольку я не использую шаблоны, их очень мало).
Например, ключевые слова «переопределить» и «окончательный» уже сделаны.
MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL //macro, defines to "final" if c++11 is present.
Я задаю вопрос, потому что знаю, что вопрос «nullptr» немного странный, поэтому, может быть, просто делать то же, что я уже делал для переопределения и финала, неправильно. Нужны мнения об этом. Любая помощь приветствуется.
Вы могли бы вероятно создать «ложь» my_nullptr
типа my_nullptr_t
следующим образом:
const class my_nullptr_t
{
public:
/* Return 0 for any class pointer */
template<typename T>
operator T*() const
{
return 0;
}
/* Return 0 for any member pointer */
template<typename T, typename U>
operator T U::*() const
{
return 0;
}
/* Safe boolean conversion */
operator void*() const
{
return 0;
}
private:
/* Not allowed to get the address */
void operator&() const;
} my_nullptr = {};
Это работает с C ++ 03 и C ++ 11 и всегда должно быть безопасным, независимо от того, какие функции C ++ 11 реализованы. Это решение на самом деле уже обсуждалось в Эта тема что предложил версию nullptr_t
основанный на Официальное предложение.
NULL
макрос, который расширяется до константы нулевого указателя Это все еще работает так же, как раньше. Код, который должен работать с компиляторами не-C ++ 11, должен использовать NULL
,
Я думаю, что следующее будет работать:
#include <cstddef>
#ifndef MY_LIB_NULL
#ifndef NULL //check for NULL
#define MY_LIB_NULL nullptr
#else
#define MY_LIB_NULL NULL ///use NULL if present
#endif
#endif
в основном я проверяю на «NULL». который является макросом и может быть проверен до тех пор, пока компилятор не будет поставлен с этим макросом (вероятно, будет), чем это допустимо при использовании макроса, когда компилятор будет предоставлять только «nullptr» и больше не будет иметь NULL, тогда используется nullptr (возможно, в далекое будущее, но, кажется, мы можем с радостью продолжать использовать NULL!)
Я думаю, что это безопаснее, чем переопределение «nullptr» (как большинство людей пытаются сделать)