Есть ли способ определить глобальные константы определенного класса внутри этого пространства имен классов в C ?

#c

Вопрос:

Представьте, что у меня есть структура C под названием Color

 struct Color {
    float r,g,b;
};
 

и функция, которая принимает цветной объект и что-то с ним делает:

 void func(const Color amp; color) {...}
 

Обычно я вызываю эту функцию с помощью цветных объектов, построенных на лету:

 func(Color{0.1,0.2,0.3});
 

Но есть определенные цвета, которые я часто использую, например, черный, белый и красный. Поэтому я часто ловлю себя на том, что делаю это:

 func(Color{0.0,0.0,0.0}); // black
func(Color{1.0,1.0,1.0}); // white
func(Color{1.0,0.0,0.0}); // red
 

Вместо этого я хотел бы сделать следующее

 func(Color::black);
func(Color::white);
func(Color::red);
 

Поэтому я ищу способ определения глобальных констант типа Color внутри пространства имен Color. До сих пор я пробовал эти два варианта:

Вариант 1. определите пространство имен с тем же именем, что и структура; не работает из-за конфликтующих пространств имен.

 struct Color {
    float r,g,b;
};

namespace Color {
    const Color black{0.0,0.0,0.0};
    const Color white{1.0,1.0,1.0};
    const Color red{1.0,0.0,0.0};
}
 

Вариант 2: статические переменные внутри определения структуры; не работает, так как это делает определение структуры неполным.

 // static members
struct Color {
    float r,g,b;

    static Color red = Color{1.0,0.0,0.0};
};
 

Есть ли способ достичь того, чего я хочу, или, по крайней мере, что-то подобное?

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

1. Конечно, это возможно. В чем ваша конкретная проблема, с которой вы пытаетесь это сделать? Ошибки компоновщика?

2. Лучше использовать разные имена, такие как namespace PredefinedColor … Это облегчает понимание кода и делает его более удобным для таких инструментов, как Intellisense.

Ответ №1:

 struct Color {
    float r, g, b;

    static const Color red;
};

constexpr Color Color::red{1.0,0.0,0.0};