1、你所在的公司向市场投放了一个程序,用于处理金融交易并打印出它们的报表。为了扩展潜在市场,这个程序以几个不同的版本进行销售,每个版本有不同选项的组合–选项越多,价格就越高,你的任务是为一个打印函数实现代码,这样它可以很容易进行编译,产生程序的不同版本。
你的函数名是print_ledger。它接受一个int参数,没有返回值,它应该调用一个或多个下面的函数,具体取决于该函数被编译时哪个符号(如果有的话)被定义:
If this symbolis defined… | Then you callthis function. |
---|---|
OPTION LONG | print_ledger_long |
OPTION DETAILED | print_ledger_detailed |
(neither) | print_ledger default |
每个函数都接受单个int参数,把你收到的值传递给你该调用的函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_ledger(int data);
void print_ledger_long(int data);
void print_ledger_detail(int data);
void print_ledger_default(int data);
void main(int argc, char **argv)
{
print_ledger('a');
}
void print_ledger(int data)
{
#ifdef OPTION_LONG
print_ledger_long(data);
#endif
#ifdef OPTION_DETAILED
print_ledger_detailed(data);
#endif
#if !defined(OPTION_LONG) && !defined(OPTION_DETAILED)
print_ledger_default(data);
#endif
}
void print_ledger_long(int data)
{
printf("print ledger long: %c\n", data);
}
void print_ledger_detailed(int data)
{
printf("print ledger detailed: %c\n", data);
}
void print_ledger_default(int data)
{
printf("print ledger default: %c\n", data);
}
2、编写一个函数,返回一个值,提示运行这个函数的计算机类型。这个函数将由一个能够运行与许多不同计算机的程序使用。我们将使用条件编译来实现这个魔术,你的函数应该叫做cpu_type,它不接受任何参数,当你的函数被编译时,在下面表中“已定义”列中的符号之一可能会被定义,你的函数应该从“返回值”列中返回对应的符号,如果左边列中的所有符号均未定义,那么函数就返回CPU_UNKNOWN这个值,如果超过一个符号被定义,那么其结果就是未定义的。
Defined | Returned |
---|---|
VAX | CPU_VAX |
M68000 | CPU_68000 |
K68020 | CPU_68020 |
I80386 | CPU_80386 |
X6809 | CPU_6809 |
X6502 | CPU_6502 |
U3B2 | CPU_3B2 |
(none) | CPU_UNKNOWN |
“返回值”列中的符号将被#define定义为各种不同的整形值,其内容位于头文件cpu_type.h中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define I80386
int cpu_type();
enum {CPU_VAX, CPU_68000, CPU_68020, CPU_80386, CPU_6809, CPU_6502, CPU_3B2, CPU_UNKNOWN};
void main(int argc, char **argv)
{
printf("cpu type: %d\n", cpu_type());
}
int cpu_type()
{
#if defined(VAX)
return CPU_VAX;
#elif defined(M68000)
return CPU_68000;
#elif defined(M68020)
return CPU_68020;
#elif defined(I80386)
return CPU_80386;
#elif defined(X6809)
return CPU_6809;
#elif defined(X6502)
return CPU_6502;
#elif defined(U32B2)
return CPU_3B2;
#else
return CPU_UNKNOWN;
#endif
}