使用预处理指令#define for long-long


#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名称。

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

这是你在竞争激烈的编程网站上看到的,但如果你在实际工作中尝试过,它将无法通过任何合理的代码审查。

#define ll long long没有错(除了你可能会把它和11混淆(,它完全按照它应该做的做。

但是,转换为long long(a)的强制转换ll(a)是无效的(此形式中不允许使用空格(。

您需要使用(ll)a,它将变为(long long)a


我应该提到,使用类型定义而不是#define语句来实现这一点会更好。这将是其中之一:

typedef long long ll
using ll = long long;

记住类型转换方法,首先我们必须先用大括号写typename,然后像(int)a这样写变量。

在您的代码中,您滥用了宏。你必须先写关键字,然后写你想用它来调用关键字的东西,比如#define long long ll,然后你可以用long long作为ll。这就是代码中的所有问题。

相关内容

  • 没有找到相关文章

最新更新