【发布时间】:2018-06-26 10:44:25
【问题描述】:
我知道通过比较两个任意 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 标准的正确部分,以便我可以真的确定我理解所有的细微之处。
【问题讨论】:
-
在这种情况下
enum可能更有用。 -
在实现这些时您有什么问题吗? C 标准也可以用实际代码进行测试。您还可以测试您的实际实现,而不是阅读它应该是什么。
-
不,到目前为止还没有遇到任何问题。只是想确保我没有滥用 C 标准(并且想创建一个答案不是“使用 strcmp !!”的问题,就像我发现的所有其他人一样!)。实际代码与此极为相似。
-
@dvhh 我同意;如果可能的话,我的目标基本上是在已经编写好的程序的结构内工作。
-
我不认为初始化是合法的。一些 gcc 版本接受它,但我确定它不是可移植的;
meals[0]不是常量表达式(在 C 中),静态初始化器必须是所有常量。
标签: c string-literals