#define dItemName L"CellPhone"
答案 0 :(得分:15)
将其定义为常量变量。这是一个很好的编程实践。
const wchar_t *dItemName = L"CellPhone";
如果您稍后需要知道字符串的长度,请将其定义为数组:
const wchar_t dItemName[] = L"CellPhone";
另外,为什么#define是坏的:它将您使用单词dItemName的所有地方转换为L“CellPhone”。例如:
struct {
int dItemName;
} SomeStruct;
将失效:
struct {
int L"CellPhone";
} SomeStruct;
答案 1 :(得分:6)
#define
的一个主要问题是它不在语言本身之内,因此不限于给定的范围。您将在翻译单元的任何位置,所有名称空间,类,函数等中替换dItemName
。
我将其替换为const std::wstring dItemName = L"CellPhone";
答案 2 :(得分:6)
有趣的是,我找不到一个指出所有缺点的问题,即使这个问题之前已经讨论过了。
首先,不是在C
(而不是C ++)中,这是声明常量的方式。这也解释了为什么这么多的C ++开发人员仍在使用它:当他们来自C背景或者是由具有C背景的人教授/学习时,他们倾向于重现这种C-ish行为。
但是,在C ++中,我们拥有卓越的设施。
#define
没有定义常量,它定义了一个宏
宏不知道范围:
它们是预处理工具:预处理器不了解底层语言的规则(无论是asm,C还是C ++),并且总是会扩展库存中的符号而不考虑范围。
出于这个原因,通常建议使用一组特定的符号来将宏分开。人们通常使用ALL_CAPS
符号,但您需要记住:
以符合C ++标准。
宏不是类型安全的。
正如我所说,预处理器忽略了基础语言规则,因此下面的内容并不奇怪:
#define FOO "foo"
int main(int argc, char* argv[])
{
if (FOO) { ... }
return 0;
}
另一方面,使用正确的类型可以防止这种无意的错误:
std::string const Foo = "foo";
结论?
如果您愿意,可以使用#define
,这只是您在做额外的工作而不是编译器,但这是您的电话。个人:我很懒:)
答案 3 :(得分:1)
#define
是一个定义宏的预处理器指令。在您的情况下,宏dItemName
的值为L"CellPhone"
。
宏很糟糕,主要是因为它们是在实际代码之前处理的。这意味着它们不受范围和C ++语法规则的约束。如果你有一个名为dItemName
的变量,那么事情就不会有用了:由于这个原因你会得到难以理解的编译错误。
解决方案是将dItemName
声明为变量(在本例中为const
变量)。
答案 4 :(得分:1)
因为您刚刚制作的预处理器宏污染了每个名称范围。它们随处可用,不遵循标准命名范围规则。因此,对于像这样的宏,像int dItemName = 5;
这样的代码被预处理器改为f {而不是int L"CellPhone" = 5;
。一个常量的全局变量不会这样做。
除了所有其他问题,这是IMNSHO宏观定义的更糟糕问题。
答案 5 :(得分:1)
指出要将他们所发明的东西定义为失败的原因 - 好好指责切割刀。
如果你没有用UPPERCASE_NAMES正确命名你的定义你会遇到麻烦,但是如果你不能自律你的工作方式,那么无论如何你都会遇到麻烦。
您不能使用const来生成动态重新排列系统,因此它不适合任何为使用前预编译而定制的嵌入式应用程序.Const只能分配预评估常量,因此甚至不能用于其他const表达式。
仅仅因为一个工具没有向OO-Paradigm鞠躬,它不会突然变得无用。 Const在功能上不等于替代。