1.4 C/C++ 预处理

一、#error 的目的

#error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提示消息,并停止编译。其语法格式为:#error error-message

#ifdef XXX
...
#error "XXX has been defined"
#else
#endif

二、typedef 和 #define 有什么区别?

1、#define 是预处理命令,只是在预处理阶段进行简单机械的字符串替换,不做正确性检查;typedef 在编译时被处理,具有类型检查功能,如:

#define int_ptr (int*)
int_ptr i,j  //这样就会报错,相当于 int *i,int j
typedef int* int_ptr
int_ptr i,j  //不会报错,相当于 int *i,*j

2、typedef 只是为定义类型起别名;#define 可以为变量取别名,定义常量、变量、编译开关。

3、作用域不同,#define 没有作用域,只要之前定义过,后面都可使用,而 typedef 有作用域。

void fun(){
    #define A int
}
void gun(){
    //这里也可以使用A,因为宏替换没有作用域,但如果上面用的是 typedef,那这里就不能用 A,不过,一般不在函数内使用 typedef
}

三、#include <filename. h> 和 #include "filename. h" 有什么区别?

对于 include <filename. h>,编译器先从标准库路径开始搜索 filename.h,使得系统文件调用较快。而对于 #include "filename.h",编译器先从用户的工作路径开始搜索 filename.h,然后去寻找系统路径,使得自定义文件较快。

四、头文件中可以定义静态变量吗?

不可以。如果在头文件中定义静态变量,则每个包含头文件的 c 文件都会包含一个静态变量的独立副本,在一个 c 文件对静态变量修改,不会导致另一个 c 文件的静态变量修改,导致逻辑混乱。

五、头文件中定义普通变量可能引发重复定义错误,只能声明

//可以这样
// good_example.h
#ifndef GOOD_EXAMPLE_H
#define GOOD_EXAMPLE_H
extern int globalVar;
#endif

// good_example.c
#include "good_example.h"
int globalVar = 10;

六、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个?

#define MIN(A,B) ((A) <= (B) ? (A) : (B))

七、不使用流程控制语句,如何打印出1~1000的整数?

#include <stdio. h>
#define A(x)x;x;x;x;x;x;x;x;x;
int main (){
    int n=0;
    A(A(A(printf("%d", ++n);
    return 0;
}

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务