BiT*_*BiT 0 c++ preprocessor using
我知道使用预处理器指令来缩短与此类似的类型名称:
#define LL long long
Run Code Online (Sandbox Code Playgroud)
然而,我看到有人使用不同的方法:
using LL = long long;
Run Code Online (Sandbox Code Playgroud)
除了语法之外,这两者之间还有什么区别吗?在大多数情况下更推荐哪一种?
using(或typedefC++11 之前)是首选方法。它创建了一个正确的类型别名,编译器实际上将其视为类型而不是其他任何东西。
不以这种方式使用的一个非常重要的原因#define是它是在调用编译器之前由预处理器全局处理的。它不理解或尊重 C++ 语法。它只是任意文本替换,它会无条件地将所有出现的已定义符号替换为指定文本,无论该符号出现在代码中的何处。
因此,例如,如果您有一个函数、变量、类类型,基本上任何名为 的标识符LL,#define您显示的 都会将其替换为long long,从而破坏代码的语法,例如:
#define LL long long
void Func1(LL value); // OK: compiler sees "void Func1(long long value);"
void Func2(char LL); // ERROR: compiler sees "void Func2(char long long);"
void LL(arguments...); // ERROR: compiler sees "void long long(arguments...);"
class LL // ERROR: compiler sees "class long long"
{
LL value; // OK: compiler sees "long long value;"
void Method1(LL value); // OK: compiler sees "void Method1(long long value);"
void Method2(char LL); // ERROR: compiler sees "void Method2(char long long);"
void LL(arguments...); // ERROR: compiler sees "void long long(arguments...);"
};
Run Code Online (Sandbox Code Playgroud)
而using(或typedef) 类型别名不会破坏代码的语法,如下所示:
using LL = long long; // or: typedef long long LL;
void Func1(LL value); // OK: compiler sees "void Func1(long long value);"
void Func2(char LL); // OK: compiler sees "void Func2(char LL);"
void LL(arguments...); // OK: compiler sees "void LL(arguments...);"
class LL // OK: compiler sees "class LL"
{
LL value; // OK: compiler sees "long long value;"
void Method1(LL value); // OK: compiler sees "void Method1(long long value);"
void Method2(char LL); // OK: compiler sees "void Method2(char LL);"
void LL(arguments...); // OK: compiler sees "void LL(arguments...);"
};
Run Code Online (Sandbox Code Playgroud)