📜  宏与函数

📅  最后修改于: 2021-05-25 22:49:48             🧑  作者: Mango

宏是经过预处理的,这意味着所有宏都将在程序编译之前进行处理。但是,函数不是经过预处理的,而是经过编译的

请参见下面的宏示例:

C
#include
#define NUMBER 10
int main()
{
     printf("%d", NUMBER);
     return 0;
}


C++
#include
#define NUMBER 10
using namespace std;
int main()
{
     cout<


C
#include
int number()
{
    return 10;
}
int main()
{
    printf("%d", number());
    return 0;
}


C++
#include
using namespace std;
int number()
{
    return 10;
}
int main()
{
    cout<


C
#include
#define CUBE(b) b*b*b
int main()
{
     printf("%d", CUBE(1+2));
     return 0;
}


C
#include
int cube(int a)
{
     return a*a*a;
}
int main()
{
    printf("%d", cube(1+2));
    return 0;
}


输出:

10

请参见下面的函数示例:

C

#include
int number()
{
    return 10;
}
int main()
{
    printf("%d", number());
    return 0;
}

C++

#include
using namespace std;
int number()
{
    return 10;
}
int main()
{
    cout<

输出:

10

现在使用命令编译它们:

gcc –E file_name.c

这将为您提供可执行代码,如图所示:

12

这表明宏是经过预处理的,而函数没有经过预处理。
在宏中,没有进行类型检查(不兼容的操作数等),因此在某些情况下使用宏会导致错误/副作用。但是,函数不是这种情况。另外,宏不会检查编译错误(如果有)。考虑以下两个代码:

巨集:

C

#include
#define CUBE(b) b*b*b
int main()
{
     printf("%d", CUBE(1+2));
     return 0;
}

输出:意外的输出

7

注意:此宏如下扩展

CUBE(1 + 2)=== 1 + 2 * 1 + 2 * 1 + 2等于7 [正确但出乎意料的结果]

要解决此问题,我们需要将#define CUBE(b)b * b * b替换为#define CUBE(b)(b)*(b)*(b)。使用更新的宏,CUBE(1 + 2)将扩展为

CUBE(1 + 2)===(1 + 2)*(1 + 2)*(1 + 2)等于27 [正确和预期结果]

职能:

C

#include
int cube(int a)
{
     return a*a*a;
}
int main()
{
    printf("%d", cube(1+2));
    return 0;
}

输出:如预期

27
  • 宏通常是一个班轮。但是,它们可以包含多行,请单击此处查看用法。功能上没有这样的约束。
  • 宏和函数的速度有所不同。宏通常比函数快,因为它们不涉及实际的函数调用开销。

结论:
不再建议使用宏,因为它们会导致以下问题。在现代编译器中,有一个更好的方法是内联函数和const变量。下面是宏的缺点:
a)没有类型检查
b)调试困难,因为它们导致简单的更换。
c)宏没有名称空间,因此代码的一个部分中的宏会影响另一部分。
d)宏可能会导致副作用,如上面的CUBE()示例所示。

Macro Function
Macro is Preprocessed Function is Compiled
No Type Checking is done in Macro Type Checking is Done in Function
Using Macro increases the code length Using Function keeps the code length unaffected
Use of macro can lead to side effect at later stages Functions do not lead to any side effect in any case
Speed of Execution using Macro is Faster Speed of Execution using Function is Slower
Before Compilation, macro name is replaced by macro value During function call, transfer of control takes place
Macros are useful when small code is repeated many times Functions are useful when large code is to be written
Macro does not check any Compile-Time Errors Function checks Compile-Time Errors
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”