Я знаю, что для двух произвольных c-строк (const char *
) не имеет смысла сравнивать их (a == b)
.
Но я думаю, что когда оба определены одним и тем же строковым литералом, это допустимо.
Например, здесь:
#include <stddef.h>
const char * const meals[] = {
"none",
"breakfast",
"lunch",
"dinner"
};
#define NO_MEALS meals[0]
#define BREAKFAST meals[1]
#define LUNCH meals[2]
#define DINNER meals[3]
// i hours after midnight, hour_to_meals_map[floor(i)] is being served.
const char * hour_to_meal_map[] = {
NO_MEALS,
NO_MEALS,
NO_MEALS,
NO_MEALS,
NO_MEALS,
BREAKFAST, // i = 5
BREAKFAST,
BREAKFAST,
BREAKFAST,
BREAKFAST,
BREAKFAST,
LUNCH, // i = 11
LUNCH,
LUNCH,
LUNCH,
LUNCH,
LUNCH,
DINNER, // i = 17
DINNER,
DINNER,
DINNER,
DINNER,
DINNER,
DINNER // i = 23
};
// Returns a boolean for whether the two hours have the same meal being eaten.
int same_meal(size_t hour_one, size_t hour_two) {
return hour_to_meal_map[hour_one] == hour_to_meal_map[hour_two];
}
(Что касается того, почему вы должны hour_to_meal_map
отображать в строки, а не в индексы, никто не знает ... но я работаю над проектомэто настроено таким образом.)
Правильно ли я понимаю, что это допустимо здесь, и что важно то, что есть только одна точка, в которой каждое значение записывается как литерал?(#define NO_MEALS "none"
было намеренно исключено !!)
Если этот код находится в заголовочном файле, это не имеет значения, не так ли?(Я ожидаю, что стандарт требует, чтобы meals
имел одинаковые значения в каждой единице компиляции?).
Я нахожу множество вопросов от начинающих, спрашивающих о случаях, когда совершенно очевидно, что они должны использовать strcmp
, но я не могу найти тот, который отвечает на этот конкретный случай.Буду признателен за любую помощь, особенно если вы можете указать мне правую часть стандарта C, чтобы я мог быть действительно уверен, что я понимаю все тонкости.