Страницы

Поиск по вопросам

понедельник, 2 марта 2020 г.

Разное поведение constexpr на разных платформах

#cpp #cpp14 #constexpr


Доброго времени суток. Есть класс, который включает в себя другой класс со статическими
членами массивами. Я очень хочу сделать что бы у меня была возможность задать все статик
значения этих членов в хедере а не в cpp части. Для этого я применил constexpr и эта
схема нормально заработала на компиляторе от Microsoft. Однако на g++ под ARM на Debian
этот код не компилируется:


  undefined reference to `Foo::Target::IP'


В обоих случаях используется С++14. Вопрос вот в чём. Почему один компилятор это
принимает, а другой нет, т.е. в чём отличия работы с constexpr внутри у этих компиляторов?
Это никак не стандартизовано? Что мне сделать, чтобы такая схема заработала?

class Foo {
public:
    static void GetIp(uint8_t* data) {
        memcpy(data, &Target::IP[0], 4);
    };
private:
    class Target {
    public:
        static constexpr uint8_t IP[4] = { 192,168,0,110 };
        static constexpr uint16_t Port = 3000;
    };
};
int main()
{
    uint8_t A[4];
    Foo::GetIp(A);
    printf("%u.%u.%u.%u", A[0], A[1], A[2], A[3]);
    system("PAUSE");
    return 0;
}

    


Ответы

Ответ 1



Да чтоб заработало, все просто - добавить constexpr uint8_t Foo::Target::IP[4]; Только и всего. См. https://ideone.com/ZMqPMn Но вот что именно строго по стандарту, а что нет - тут я не скажу, не уверен. Понятно, что целочисленное поле и массив - разные вещи, но что именно стандарт разрешает, что нет, и что отдает на откуп реализации - не скажу...

Комментариев нет:

Отправить комментарий