使用预处理指令 #define 定义长整型(long long)

3
#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 有什么问题。


2
请使用int64_t代替long long。 - Rsvay
使用typedef代替#define,我也学到了新东西,即#define ll long long是无效的 :) - Agent_A
我会直接输入 int64_t 而不是 ll。是的,我知道这多了几个字符,但它可以提高可读性。 - drescherjm
3个回答

10

记住,#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的头文件,无论任何目的,它都会出现错误。

    为了避免这种情况,宏应该具有长而可怕的大写字母名称。

宏应该是最后的紧急选项,在所有其他方法失败时使用,而不仅仅是因为您不想输入一些额外的字母。

这是您在竞赛编程网站上看到的东西,但如果您在实际工作中尝试这样做,它将无法通过任何合理的代码审查。


3

#define ll long long没有问题(除了可能与11混淆),它确切地完成了预定的任务。

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

你需要使用(ll)a,这将变成(long long)a


我应该提到,最好使用类型定义来完成这个任务,而不是使用#define语句。可以使用以下之一:

typedef long long ll
using ll = long long;

-1

记住类型转换方法,我们首先要写出类型名称,然后加上括号再加上变量,就像这样:(int)a

在您的代码中,您误用了宏定义。您必须首先编写关键字,然后是您想调用该关键字的内容,就像这样:#define long long ll,然后您可以使用long long作为ll。这就是您代码中的所有问题。


2
“我们必须先写出类型名称”并不一定。 尽管 long long(a) 无法编译,但 int(a) 可以编译通过。 “你必须先写关键字”我并不完全理解这个想法,但是 #define long long ll 是错误的。 它会将 long 替换为 long ll,这几乎没有意义。(更不用说重复使用关键字例如 long 作为宏名称是非法的,您必须自己想出名称。)OP原始的宏更有意义。 - HolyBlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接