我有一个函数,它返回一个const char *到一个固定的值,当我使用这个函数时,我做一个“==”运算符来找到返回的值和我期望的值之间的平等。这是一个好习惯吗?它应该是反模式吗?例如:
const char * LOL = "LOL";
const char * getI() {
return LOL;
}
main {
if (getI() == LOL)
something();
}
这是一个好习惯吗?
嗯,这取决于。
当且仅当您想要测试getl()
返回的指针是否指向与全局LOL
指针相同的字符串文字时,这是正确的做法。如果那不是你想要做的,那么,不,这不是好的做法。
那要看。如果您试图检测字符串的实例是否相同,那么这是正确的做法。如果您试图检测字符串的内容是否相同,那么它不是。
正如其他人所说,这取决于你想做什么。
当你说“我期望的价值”时,你的意思是什么?你能指望什么?
不知道你对此的回答:总的来说,糟糕的做法。据我所知,编译器可以巧妙地重用字符串的位置。所以这个行为:
const char *LOL = "lol";
const char *test = "lol";
return (test == LOL);
没有明确的定义。
好吧,...你正在尝试使用全局名称返回一个值,以便代码更具可读性,对吧? (如果我误解了,请忽略:P)。理由很棒,但这不是可行的方法。
通常的做法是#define
:
#define MY_MEANINGFUL_RETURN 1
int doSomething() {
return MY_MEANINGFUL_RETURN;
}
(...)
if (doSomething() == MY_MEANINGFUL_RETURN)
(...)
如果您使用上面的const char * techique,则必须在执行期间将这些字符串存储在内存中,然后仅比较它们的内存位置。使用第二种方法,编译器管理数字,您可以获得漂亮的名称,而无需任何额外的时间或空间。
对象身份与平等:
如果您打算将它用作“识别”对象的方式/构造(在本例中是全局指针LOL,它实际上只是代码行中的SAME对象),那么它是安全的。
但是深入研究一下你的例子,看起来你真正想做的就是检查“相等”:即测试这两个对象是否相等,即它们是否包含相同的值?