宏是经过预处理的,这意味着所有宏都将在程序编译之前进行处理。但是,函数不是经过预处理的,而是经过编译的。
请参见下面的宏示例:
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
这将为您提供可执行代码,如图所示:
这表明宏是经过预处理的,而函数没有经过预处理。
在宏中,没有进行类型检查(不兼容的操作数等),因此在某些情况下使用宏会导致错误/副作用。但是,函数不是这种情况。另外,宏不会检查编译错误(如果有)。考虑以下两个代码:
巨集:
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等的更多准备工作,请参阅“完整面试准备课程” 。