C和指针 第14章 预处理器 14.10 编程练习

1. 你所在的公司向市场投放了一个程序,用于处理金融交易并打印它们的报表。为了扩展潜在的市场,这个程序以及个不同的版本进行销售,每个版本都有不同选项的组合---选项越多,价格就越高。你的任务是实现一个打印函数的代码,这样它可以很容易地进行编译,产生程序的不同版本。
你的函数名为print_ledger。它接受一个int参数,没有返回值。它应该调用一个或多个下面的函数,具体依取决于该函数被编译时定义了哪个符号(如果有的话)。 
        如果这个符号被定义为...                那么就调用这个函数
        OPTION_LONG                            print_ledger_long
        OPTION_DETAILED                     print_ledger_detailed
        (无)                                                print_ledger_default
每个函数都接受单个int参数。把接收到的值传递给应该调用的函数。 
解析:
这个问题唯一的棘手之处在于两个选项都有可能被选择。这种可能性使得无法使用#elif指令来确定哪一个未被定义。
/*
** 打印风格有预定义符号指定的分类账户。 
*/ 
void print_ledger( int x ){
    #ifdef OPTION_LONG
    #define OK 1
        printf_ledger_long( x );
    #endif
    
    #ifdef OPTION_DETAILED
    #define OK 1
        printf_ledger_detailed( x );
    #endif
    
    #ifndef OK
        printf_ledger_default( x );
    #endif

2. 编写一个函数,返回一个值,提示运行这个函数的计算机的类型。这个函数将由一个能够运行于不同计算机的程序使用。
我们将使用条件编译来实现。你的函数应该叫做cpu_type,它不接受任何参数。当函数被编译时,在下表“定义符号”列中的符号之一可能被定义。函数应该从“返回值”列中返回对应的符号。如果左边列中的所有符号均未定义,那么函数就返回CPU_UNKNOWN这个值。如果超过一个的符号被定义,那么其结果就是未定义的。
        定义符号                    返回值
        VAX                            CPU_VAX
        M68000                      CPU_68000
        M68020                      CPU_68020
        I80386                        CPU_80386
        X6809                         CPU_6809
        X6502                         CPU_6502
        U3B2                          CPU_3B2
        (无)                             CPU_UNKNOWN
“返回值”列中的符号将被#define定义为各种不同的整型值,其内容位于头文件cpy_type.h中。
解析: 
/*
** cpu_tye.h
*/
#ifndef  CPU_TYPE_H
#define CPU_TYPE_H

#define CPU_VAX  0
#define CPU_68000 1
#define CPU_68020 2
#define CPU_80386 3
#define CPU_6809 4
#define CPU_6502 5
#define CPU_3B2 6
#define CPU_UNKNOWN 7

#endif

#include <stdio.h>
#include <stdlib.h>
#include "cpu_type.h"

int cpu_type( void );

int main( void ){
    int type = cpu_type();
    
    printf( "type = %d\n", type );
    
    return EXIT_SUCCESS;    
}

int cpu_type( void ){
    int counter = 0;
    int cpu_type;
    #if defined( VAX )
        cpu_type = CPU_VAX;
        counter++;
    #elif defined( M68000 )
        cpu_type = CPU_68000;
        counter++;
    #elif defined( M68020 )
        cpu_type = CPU_68020;
        counter++;
    #elif defined( I80386 )
        cpu_type = CPU_80386;
        counter++;
    #elif defined( X6809 )
        cpu_type = CPU_6809;
        counter++;
    #elif defined( X6502 )
        cpu_type = CPU_6502;
        counter++;
    #elif defined( U3B2 )
        cpu_type = CPU_3B2;
        counter++;
    #else
        cpu_type = CPU_UNKNOWN;
        counter++;
    #endif
    if( counter != 1 ){
        printf( "the result is undefined.\n" );
        return -1;
    } else{
        return cpu_type;
    }
}
输出:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值