zoukankan      html  css  js  c++  java
  • 面试笔试(C++部分)

    1.define 和const,inline的区别

    define的缺点:

    1.边界效应(必须加括号,才能避免边界效应)

    #define MUL(A,B) A*B
    而在使用的时候,这样的调用:
    int a=1,b=2,c=3,d=0;
    d=MUL(a+b,c)
    经过编译时候展开,就变成了
    d=a+b*c
    而不是我们所希望的
    d=(a+b)*c
    [解决办法]
    其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题
    即,在宏定义的时候,如此定义:
    #define MUL(A,B) ((A)*(B))

    2、不能进行类型检查

    define定义的变量,是Compile-Time时期的变量,系统在编译时候,就将其全部替换,而不会对其变量进行类型等属性检查,相对不是很安全,可能存在潜在的问题,而没有发现.

    正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间.

    const定义的变量,是 Run-Time时期的变量,如果类型不匹配,系统在运行时候,就会发现并提示或报错,对应的,const变量在运行时期,也是一种变量,系统会为其分配内存.

    3、编辑前就进行define替代,导致代码难以阅读和维护

    4、运行结果的不定性:

    #define max(a,b)      ((a)>(b)?(a):(b))
    int  a=5,b=10;
    
    max(++a,b);    //a++两次
    
    max(++a,b+10);   //a++一次

    define 和inline的区别:

    inline是内联函数,进行函数展开,不需要进行函数调用的过程,有类型检查

    define特有的功能,不能被inline和const替代的功能:

    用于#include和#ifdef和#ifndef的头文件重复包含

    头文件重复包含的坏处:1、有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些

    2、有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)

    一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。

    例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式:

     

     

    第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);

    第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。

    最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。

    但是,即便使用#ifdef #endif ,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。

  • 相关阅读:
    mysql事务
    数据类型
    win10 开启全局代理
    高并发的一些思考
    多线程也不一定比单线程快
    单线程的JavaScript
    Vue2 响应式原理
    检查Object是否存在某个属性
    堆和栈
    LeetCode
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4710209.html
Copyright © 2011-2022 走看看