Comments 8
Если вы считаете, что виновата OS X, то спешу вас уверить, эта «фича» присутствует и в Ubuntu, и в MinGW
OS X, Ubuntu, MinGW — странный ряд, напоминает задачку в стиле «уберите лишние».
А так — да, любопытно, буду теперь больше внимания обращать на особенности работы с constexpr. Спасибо за статью.
+4
уберите лишнееВ целом, да. OS X — это моя основная система. Из Linux предпочитаю Debian, но на Ubuntu компилятор был новее. MinGW вообще не особо к месту, но так как VS — это не единственный способ разработки на Windows, то упомянул и его.
0
Живой пример ряда:
Кусок исходников, которые должны работать после сборки на GCC (Solaris), VisualStudio, под Green компилятор для терминалов Verifone.
И ничего из ряда убрать нельзя.
Ни за что переносимом коде нельзя использовать фичи, появившиеся позже 2000 года…
Иначе сюрпризы будут на каждом шагу.
Кусок исходников, которые должны работать после сборки на GCC (Solaris), VisualStudio, под Green компилятор для терминалов Verifone.
И ничего из ряда убрать нельзя.
Ни за что переносимом коде нельзя использовать фичи, появившиеся позже 2000 года…
Иначе сюрпризы будут на каждом шагу.
+1
a.cpp:
b.cpp:
h.h:
#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();
+2
Впрочем работает это только при вызове constexpr варианта, при попытке вызова от аргумента, который не известен на этапе компиляции, компилятору придется включить этот код в объектный файл. Но мы же говорим про константы этапа компиляции, не так ли? Для одиночных констант такой проблемы не будет (конечено если не пытаться брать адрес constexpr функции).
0
Sign up to leave a comment.
И ещё раз про уникальные константы