Al *_*epp 15

将其定义为常量变量.这是一个很好的编程实践.

const wchar_t *dItemName = L"CellPhone";
Run Code Online (Sandbox Code Playgroud)

如果您稍后需要知道字符串的长度,请将其定义为数组:

const wchar_t dItemName[] = L"CellPhone";
Run Code Online (Sandbox Code Playgroud)

另外,为什么#define是坏的:它将您使用单词dItemName的所有地方转换为L"CellPhone".例:

struct {
  int dItemName;
} SomeStruct;
Run Code Online (Sandbox Code Playgroud)

将失效:

struct {
  int L"CellPhone";
} SomeStruct;
Run Code Online (Sandbox Code Playgroud)

  • 嗯...只是为了挑剔...文字实际上不是指针,而是数组,所以正确的定义是:`const wchar_t dItemName [] = L"CellPhone";`.几乎没有区别,但有一些.特别是,编译器知道数组的大小,但不知道指针指向的元素数. (3认同)

Fre*_*son 6

一个主要问题#define是它不在语言本身之内,因此不限于给定的范围.您将替换dItemName翻译单元中的任何位置,所有名称空间,类,函数等.

我用它替换它 const std::wstring dItemName = L"CellPhone";


Mat*_* M. 6

有趣的是,我找不到一个指出所有缺点的问题,即使这个问题之前已经讨论过了.

首先,不是在C(不是C++)中这是声明常量的方式.这也解释了为什么这么多的C++开发人员仍在使用它:当他们来自C背景或者是由具有C背景的人教授/学习时,他们倾向于重现这种C-ish行为.

但是,在C++中,我们拥有卓越的设施.

#define 没有定义常量,它定义了一个宏

  1. 宏不知道范围
  2. 宏不是类型安全的

宏不知道范围:

它们是预处理工具:预处理器不知道底层语言的规则(无论是asm,C还是C++),并且总是会扩展库存中的符号而不考虑范围.

因此,通常建议使用一组特定符号将宏分开.人们通常使用ALL_CAPS符号,但你需要记住:

  • 它们不应包含两个连续的下划线
  • 它们不应该以下划线开头

为了符合C++标准.

宏不是类型安全的.

正如我所说,预处理器忽略了底层的语言规则,因此以下内容并不会让它变得奇怪:

#define FOO "foo"

int main(int argc, char* argv[])
{
  if (FOO) { ... }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,使用适当的类型可以防止这种无意的错误:

std::string const Foo = "foo";
Run Code Online (Sandbox Code Playgroud)

结论?

#define如果你愿意,你可以使用a ,只是你做了额外的工作而不是编译器,但这是你的电话.个人:我很懒:)