使用预处理指令#defineforlonglong

#include <iostream>
using namespace std;
#define ll long long

int main() {
    
    int a = 5;
    ll maxi = 1;
    maxi = max(maxi, maxi * ll(a));
    cout<<maxi<<endl;
    return 0;
    
}

为什么这段代码会抛出错误?我不明白 #define ll long long 有什么问题。

回答

请记住,#define执行文本替换。你最终得到这个:

maxi = max(maxi, maxi * long long(a));

这是无效的,因为函数转换的类型名称,粗略地说,不能在顶层包含空格。所以,unsigned int(a)long double(a)等,出于同样的原因都是无效的。

解决方案是使用using而不是#define

using ll = long long;

或做(ll)a,因为在这种情况下,空格是允许的。

但如果我是你,我会摆脱ll并使用(long long)a,因为它ll是一个相当不具描述性的名称。


请注意,这#define ll long long是对宏的滥用,并且由于多种原因而有害:

  • 这很混乱。从观察来看ll maxi = 1;,一个通情达理的人会期望ll成为一个类型和ll(a)工作。如果它不是宏,它会起作用。

  • 短名称可能与事物发生冲突。如果你把它#define放在一个标题中,然后包含另一个将这个词ll用于任何目的的标题,它就会中断。

    为了避免这种情况,宏应该有很长的可怕的 ALL_CAPS 名称。

宏应该是最后一个核心选​​项,当其他一切都失败时使用,而不仅仅是当你不想输入一些额外的字母时。

这是您在竞争性编程网站上看到的东西,但是如果您在实际工作中尝试这样做,那么任何理智的代码审查都会失败。


以上是使用预处理指令#defineforlonglong的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>