1. #include的实质是什么?
答:将引入文件内容替换到#include所在当前行。
2. #include “”与<>有何区别?如何验证你的结论?
答:1.“”是指示编译器先在当前工作目录下收搜目标文件,如果找不到就的话再到开发环境设置好的标准路径下去找。
2. <>是指示编译器在开发环境设置的路径下去查找目标文件。
在当前目录下自定义一个头文件stdio.h,里面有句#warning,然后用#include “stdio.h”,如果编译出现#warning,说明先在当前目录下收索目标文件;然后用#include ,如果编译没出现#warning,则说明去开发环境设置好的路径下去搜索目标文件;然后把自定义的stdio.h删去,用#include “stdio.h”,如果没出现#warning。则说明在当前目录搜索不到目标文件,再去开发环境设置好的路径去搜索目标文件。
3. 被#include的header file中最常见的内容可分为哪几类?
答:宏定义、函数声明、数据类型定义
4. 如何防止重复#include?(更确切的表述为“重复#include时如何防止重复定义/声明?”)需要说出2种方案,并说明各自的优缺点。
答:1.#ifndef......#endif
//show.h
#ifndef __SHOW_H
#define __SHOW_H
#include
#endif
//a.h
#ifndef __SHOW_H
#define __SHOW_H
#include
#endif
优点:可以保证只编译一次#include 目标文件,编译器都支持。
缺点:定义宏时可能会宏名冲突,可能导致目标文件不被编译。
2.#pragma once
优点:同一个目标文件只编译一次。
缺点:旧版的编译器不能识别,兼容性差。
5. #define的实质是什么?如何使用#define
答:1.简单替换。2注意空格 #define SHOW 123
6. #与##分别有作用?如
#define M(x) #x
#define M(x, y) x##y
答:#define M(x) #x 将括号中x变为字符串, M(x) #x 展开后是“x”。
#define M(x, y) x##y 是将##左右两边的字符简单连接,这里是把x,y 合并成xy
7. 例举你所知道的C语言built-in的macro。最好能指出其中哪些是特定compiler的扩展
__LINE__
__FILE__
__DATE__
__TIME__
__func__ (__FUNC__)
compiler:__WIN32__ __LINUX__ __TIME__ __DATE__ __FILE__ __LINE__
8. 如何使用typedef,typedef与#define有何区别?
答: typedef int INT;
int main()
{
INT a = 100;
return 0;
}
typedef定义数据类型
typedef unsigned int __u32;
#define _INT int*
_INT a, b;
#define定义宏,是没有数据类型的,只是在预处理是进行简单替换
9. #if和#ifdef的区别?如何使用复合条件?如下面的用法是否下确?
#ifdef A && B
答: #ifdef A等价于 #if defined(A), 所以#ifdef的成立条件是之前用#define A
#if后接表达式,当条件为真,则编译;反之,不编译。
#if A && B
#if defined(A) && defined(B)
10. 你如何使用#warning和#error?
答: #waring 只是输出警告信息,继续编译。
#error输出错误信息,退出编译。
11. 以max(x, y)为例,说明#define与inline有何区别
答: #define定义宏,inline是修饰函数,只有在需要用到的时候才像宏一样展开。
#define定义的宏不需要指明数据类型,inline修饰的函数的返回值和参数需要指明数据类型。inline修饰的函数的参数在编译的时候就需要确定值。
#define max(x, y) ((x) > (y) ? (x) : (y))
int inlene max(int x, int y)
{
return x > y ? x : y;
}
阅读(1996) | 评论(0) | 转发(0) |