C++中 宏 和 函数 有什么不同?

感觉宏和函数差不多,都是模块化一段程序,但既然它们都存在,那肯定有所不同。

请问它们哪儿不同呢?主要是适用的场合不同吗?

---------------
PS:没分了,还请路过的前辈顺手帮一下,谢谢~:)
还有,什么时候用 宏 比较好,什么时候用 函数 比较好?

宏在编译时就被替换成它内部的语句了,而函数是运行时调用的

所以如果是简单的东西就写成宏,这样没有调用函数的开销,效率会高一些。相反,由于宏每被调用一次,就相当于把代码复制一份,所以如果比较复杂的宏被多次调用的话,会增加代码的体积。因此,太复杂的运算就写成函数比较好了。

另外,要注意在宏调用时使用自增自减运算符可能会有意想不到的结果。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-04-03
(1)什么是内联函数?
内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。

(2)为什么要引入内联函数?
当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题。另外,前面我们讲到了宏,里面有这么一个例子:
#define ABS(x) ((x)>0? (x):-(x))
当++i出现时,宏就会歪曲我们的意思,换句话说就是:宏的定义很容易产生二意性。
  
我们可以看到宏有一些难以避免的问题,怎么解决呢?前面我们已经尽力替换了。

下面我们用内联函数来解决这些问题。

(3)为什么inline能取代宏?
1、 inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
2、很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3、 inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

(4)内联函数和宏的区别?
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数与带参数的宏定义进行下比较,它们的代码效率是一样,但是内联欢函数要优于宏定义,因为内联函数遵循的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,比较方便。

(5)什么时候用内联函数?
内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成
员函数定义成内联函数的话,将会获得比较好的效率。
Class A
{
Private:
int nTest;
 Public:
int readtest() { return nTest;}
void settest(int I) { nTest=I; }
}

(6)如何使用内联函数?
我们可以用inline来定义内联函数。
inline int A (int x) { return 2*x; }
不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。

(7)内联函数的优缺点?
我们可以把它作为一般的函数一样调用,但是由于内联函数在需要的时候,会像宏一样展开,所以执行速度确比一般函数的执行速度要快。当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。(换句话说就是,你使用内联函数,只不过是向编译器提出一个申请,编译器可以拒绝你的申请)这样,内联函数就和普通函数执行效率一样了。

(8)如何禁止函数进行内联?
如果使用VC++,可以使用/Ob命令行参数。当然,也可以在程序中使用 #pragma auto_inline达到相同的目的。

(9)注意事项:
1.在内联函数内不允许用循环语句和开关语句。
2.内联函数的定义必须出现在内联函数第一次被调用之前。
第2个回答  2023-04-01
宏在编译时就被替换成它内部的语句了,而函数是运行时调用的

所以如果是简单的东西就写成宏,这样没有调用函数的开销,效率会高一些。相反,由于宏每被调用一次,就相当于把代码复制一份,所以如果比较复杂的宏被多次调用的话,会增加代码的体积。因此,太复杂的运算就写成函数比较好了。

另外,要注意在宏调用时使用自增自减运算符可能会有意想不到的结果。
第3个回答  2007-09-21
宏是编译时候替换。跟把宏定义的内容,放到调用的地方效果是一模一样的。

而函数编译后就变成了调用。

效果效率是不一样的。

基本上没好与不好之分,可能用宏的话程序效率有那么一点点提高——毕竟是顺序执行,没有跳转,不用状态切换。
第4个回答  推荐于2018-04-13
C++中宏和函数的区别是, 宏定义编译的时候对代码进行替换;而函数在执行的时候需要 一些操作:
1、宏替换,宏本身不占内存,只是简单替换。
2、函数调用,要从函数入口地址进入执行,同时需要压栈
C++ 宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。预处理命令不同于一般C++语句。因此预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。简单的理解: 宏就是用来告诉编译器如何编译的一些指令.本回答被网友采纳
相似回答