声明类型别名时,“using”和“#define”之间有区别吗?

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)

除了语法之外,这两者之间还有什么区别吗?在大多数情况下更推荐哪一种?

Rem*_*eau 6

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)