defs.h.xml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <chapter xml:id="defs.h">
  2. <title><tt>__vic/defs.h</tt></title>
  3. <p>Различные фундаментальные определения.</p>
  4. <chapter xml:id="nullptr">
  5. <title><tt>nullptr</tt> <sign>C++98 only</sign></title>
  6. <p>Литерал для пустого указателя. Может использоваться вместо <tt>NULL</tt> или
  7. <tt>0</tt>. В режиме ISO C++ 98 определён как</p>
  8. <code-block lang="C++">
  9. const int nullptr = 0;
  10. </code-block>
  11. <p>Данное определение позволяет писать код в стиле C++11 при использовании
  12. стандарта C++98.</p>
  13. <p>Это одно из немногих глобальных определений библиотеки. Определение можно
  14. предотвратить, определив макрос <tt>__VIC_NO_NULLPTR_DEF</tt> перед включением.
  15. </p>
  16. <section><title>Пример</title>
  17. <code-block lang="C++"><![CDATA[
  18. int *p = nullptr;
  19. pthread_create(&tid, nullptr, thread_func, nullptr);
  20. ]]></code-block>
  21. </section>
  22. </chapter>
  23. <chapter xml:id="noexcept">
  24. <title><tt>noexcept</tt> <sign>C++98 only</sign></title>
  25. <p>В режиме C++98 - макроопределение, синоним <tt>throw()</tt>. В режимах
  26. остальных стандартов данное определение отсутсвует.</p>
  27. </chapter>
  28. <chapter xml:id="array_size">
  29. <title><tt>array_size()</tt></title>
  30. <code-block lang="C++"><![CDATA[
  31. template<class T, size_t N>
  32. constexpr size_t array_size(T (&array)[N]);
  33. ]]></code-block>
  34. <p>Возвращает количество элементов массива. Может вычисляться во время
  35. компиляции.</p>
  36. <section><title>Пример</title>
  37. <code-block lang="C++">
  38. int m[] = { 1, 2, 3, 5, 7 };
  39. size_t n = __vic::array_size(m); // n == 5
  40. int *dup = new int[n];
  41. </code-block>
  42. </section>
  43. </chapter>
  44. <chapter xml:id="non_copyable">
  45. <title><tt>non_copyable</tt></title>
  46. <code-block lang="C++"><![CDATA[
  47. class non_copyable
  48. {
  49. non_copyable(const non_copyable &) = delete;
  50. non_copyable &operator=(const non_copyable &) = delete;
  51. protected:
  52. non_copyable() = default;
  53. };
  54. ]]></code-block>
  55. <p>Наследование данного класса подавляет генерацию копирующих конструктора
  56. и присваивания. Аналог <tt>boost::noncopyable</tt>.</p>
  57. <section><title>Пример</title>
  58. <code-block lang="C++">
  59. class C : private __vic::non_copyable
  60. {
  61. };
  62. C c1;
  63. C c2 = c1; // Error! Non-copyable object
  64. </code-block>
  65. </section>
  66. </chapter>
  67. <chapter xml:id="non_heap_allocatable">
  68. <title><tt>non_heap_allocatable</tt></title>
  69. <code-block lang="C++"><![CDATA[
  70. class non_heap_allocatable
  71. {
  72. void *operator new(std::size_t ) = delete;
  73. void *operator new(std::size_t , const std::nothrow_t & ) = delete;
  74. void *operator new[](std::size_t ) = delete;
  75. void *operator new[](std::size_t , const std::nothrow_t & ) = delete;
  76. protected:
  77. non_heap_allocatable() = default;
  78. };
  79. ]]></code-block>
  80. <p>Наследование данного класса предотвращает размещение объекта в куче с
  81. использованием оператора <tt>new</tt>.</p>
  82. <section><title>Пример</title>
  83. <code-block lang="C++">
  84. class C : private __vic::non_heap_allocatable
  85. {
  86. };
  87. C c; // Ok. Allocation on stack
  88. C *p = new C; // Error! Attempt to allocate on heap
  89. </code-block>
  90. </section>
  91. </chapter>
  92. <chapter xml:id="std--move">
  93. <title><tt>std::move()</tt>, <tt>std::forward()</tt>, <tt>std::swap()</tt>
  94. <sign>C++11</sign></title>
  95. <p>Данный заголовочный файл всегда включает эти утилиты в режиме C++11.</p>
  96. </chapter>
  97. <chapter xml:id="VIC_SWAP_HEADER">
  98. <title><tt>__VIC_SWAP_HEADER</tt></title>
  99. <p>Макроопределение для <tt>#include</tt>. Раскрывается в имя заголовочного
  100. файла, который содержит определение <tt>std::swap()</tt>, в зависимости от
  101. используемого стандарта языка.</p>
  102. <section><title>Пример</title>
  103. <code-block lang="C++">
  104. #include __VIC_SWAP_HEADER
  105. </code-block>
  106. </section>
  107. </chapter>
  108. <chapter xml:id="platform-dependent-macros">
  109. <title>Системно-зависимые макроопределения</title>
  110. <p>Библиотека предоставляет набор макроопределений, позволяющий программе
  111. определить, для какой целевой платформы она собирается. Подобные определения
  112. предоставляются компиляторами, но везде под разными именами. Использование
  113. макроопределений библиотеки позволяет не зависеть от компилятора.</p>
  114. <p>Список аппаратных платформ (процессоров):</p>
  115. <list style="bulleted">
  116. <item><tt>__VIC_X86__</tt> - Intel x86 (IA32)</item>
  117. <item><tt>__VIC_X64__</tt> - x64 aka AMD 64</item>
  118. <item><tt>__VIC_IA64__</tt> - Intel IA64</item>
  119. <item><tt>__VIC_POWERPC__</tt> - PowerPC</item>
  120. </list>
  121. <p>Другие макроопределения:</p>
  122. <list style="bulleted">
  123. <item><tt>__VIC_STRICT_RAM_ALIGNMENT__</tt> - попытка вычитать из памяти
  124. невыровненные данные приведёт к ошибке шины</item>
  125. </list>
  126. </chapter>
  127. </chapter>