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)
一个主要问题#define是它不在语言本身之内,因此不限于给定的范围.您将替换dItemName翻译单元中的任何位置,所有名称空间,类,函数等.
我用它替换它 const std::wstring dItemName = L"CellPhone";
有趣的是,我找不到一个指出所有缺点的问题,即使这个问题之前已经讨论过了.
首先,不是在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;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,使用适当的类型可以防止这种无意的错误:
std::string const Foo = "foo";
Run Code Online (Sandbox Code Playgroud)
结论?
#define如果你愿意,你可以使用a ,只是你做了额外的工作而不是编译器,但这是你的电话.个人:我很懒:)
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |