面试题答案
一键面试设计思路
- 定义不同的宏来代表不同的编译选项。
- 使用
#ifdef
、#ifndef
等预处理指令结合#include
指令,根据不同的宏定义选择性地包含不同的头文件。 - 在主程序中,根据包含的不同头文件,以不同的方式调用头文件中的函数和变量。
#include
指令和宏的使用方法
- 宏定义:在编译时通过命令行参数或者在代码开头定义宏,例如
#define OPTION_1
。 #ifdef
和#include
结合:使用#ifdef
判断宏是否定义,如果定义则包含相应的头文件。例如:
#ifdef OPTION_1
#include "header1.h"
#elif defined OPTION_2
#include "header2.h"
#else
#include "default_header.h"
#endif
通过编译选项控制程序的行为
- 命令行定义宏:在编译时使用
-D
选项定义宏,例如gcc -DOPTION_1 main.c
,这样在编译时就会根据OPTION_1
宏的定义,包含header1.h
头文件。 - 代码中定义宏:在代码开头定义宏,如
#define OPTION_1
,这种方式适用于测试和固定配置的情况。
示例代码
#include <stdio.h>
// 假设这里通过命令行或者代码开头定义了宏
// 例如 #define OPTION_1
#ifdef OPTION_1
#include "header1.h"
#elif defined OPTION_2
#include "header2.h"
#else
#include "default_header.h"
#endif
int main() {
#ifdef OPTION_1
func1(); // 调用header1.h中的函数
extern int var1; // 使用header1.h中的变量
printf("Using OPTION_1, var1: %d\n", var1);
#elif defined OPTION_2
func2(); // 调用header2.h中的函数
extern int var2; // 使用header2.h中的变量
printf("Using OPTION_2, var2: %d\n", var2);
#else
default_func(); // 调用default_header.h中的函数
extern int default_var; // 使用default_header.h中的变量
printf("Using default, default_var: %d\n", default_var);
#endif
return 0;
}
假设header1.h
内容如下:
#ifndef HEADER1_H
#define HEADER1_H
void func1();
extern int var1;
#endif
header1.c
内容如下:
#include "header1.h"
#include <stdio.h>
void func1() {
printf("This is func1 from header1\n");
}
int var1 = 10;
假设header2.h
内容如下:
#ifndef HEADER2_H
#define HEADER2_H
void func2();
extern int var2;
#endif
header2.c
内容如下:
#include "header2.h"
#include <stdio.h>
void func2() {
printf("This is func2 from header2\n");
}
int var2 = 20;
假设default_header.h
内容如下:
#ifndef DEFAULT_HEADER_H
#define DEFAULT_HEADER_H
void default_func();
extern int default_var;
#endif
default_header.c
内容如下:
#include "default_header.h"
#include <stdio.h>
void default_func() {
printf("This is default_func from default_header\n");
}
int default_var = 30;