Как стать автором
Обновить

Комментарии 8

Если вы считаете, что виновата OS X, то спешу вас уверить, эта «фича» присутствует и в Ubuntu, и в MinGW

OS X, Ubuntu, MinGW — странный ряд, напоминает задачку в стиле «уберите лишние».

А так — да, любопытно, буду теперь больше внимания обращать на особенности работы с constexpr. Спасибо за статью.
уберите лишнее
В целом, да. OS X — это моя основная система. Из Linux предпочитаю Debian, но на Ubuntu компилятор был новее. MinGW вообще не особо к месту, но так как VS — это не единственный способ разработки на Windows, то упомянул и его.
Не, я имел в виду что первые два названия — названия операционных систем, а последнее — название тулкита для компиляции и дебага кода.
А, не обратил внимания. Перефразировал. Плюс поставить не могу, к сожалению.
Живой пример ряда:
Кусок исходников, которые должны работать после сборки на GCC (Solaris), VisualStudio, под Green компилятор для терминалов Verifone.
И ничего из ряда убрать нельзя.

Ни за что переносимом коде нельзя использовать фичи, появившиеся позже 2000 года…
Иначе сюрпризы будут на каждом шагу.
a.cpp:
#include <cstdio>

#include "h.h"

void printSin1() {
    for (int i =0;i<4096;++i)
        printf("%f\n", sin_table(i));
}

int main() {
    printSin1();
    printSin2();
}

b.cpp:
#include <cstdio>

#include "h.h"

void printSin2() {
    for (int i =0;i<4096;++i)
        printf("%f\n", sin_table(i));
}

h.h:
struct sin_table_t {
    float values[4096];
};

constexpr float sin_table(int i) {
    return sin_table_t{{/* */}}.values[i];
}

void printSin1();
void printSin2();
Впрочем работает это только при вызове constexpr варианта, при попытке вызова от аргумента, который не известен на этапе компиляции, компилятору придется включить этот код в объектный файл. Но мы же говорим про константы этапа компиляции, не так ли? Для одиночных констант такой проблемы не будет (конечено если не пытаться брать адрес constexpr функции).
А вариант, если достаточно доступа по индексу. Дублирования по идее не будет.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации