热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用预处理器开关确定类的版本

本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。

我有一个类,它有两种可能的实现方式,具体取决于预处理器开关。为了处理这种情况,我在项目中创建了两个头文件:'src/CompSwitch1/class.h' 和 'src/CompSwitch2/class.h'。在我的标准包含文件中,我使用以下代码来选择正确的头文件:


#ifdef CompSwitch1
#include "CompSwitch1/class.h"
#elif defined(CompSwitch2)
#include "CompSwitch2/class.h"
#else
#error "必须指定 CompSwitch1 或 CompSwitch2"
#endif

这种方法适用于大多数需要两种版本的类。然而,在其中一个类上,我遇到了链接器错误(lnk2019:未解析的外部符号)。这个问题出现在 MS Visual Studio 2005 和 2008 中。


在 .h 文件的顶部,我测试了预处理器选项。此外,虽然这里只提到了头文件,但每个实现还有一个对应的 .cpp 文件,位于相应的目录中。


解决方案


#1


可能是你包含了其中一个类的头文件,但链接了另一个类的目标文件,或者两者都没有正确包含和链接。


#2


建议使用 #elif defined(CompSwitch2) 而不是简单的 #elif CompSwitch2。这样可以确保即使定义为其他值也能正常工作。


#3


尝试在每个 cpp 实现文件中添加以下预处理器指令,以确保编译时使用的头文件与 cpp 文件一致:


// 在 compswitch1.cpp 中
#ifndef CompSwitch1
# error "包含的头文件不一致"
#endif

// 在 compswitch2.cpp 中
#ifndef CompSwitch2
# error "包含的头文件不一致"
#endif

如果编译了错误的头文件/cpp 文件对,应该会得到编译错误而不是链接错误,这更容易识别和修复。


另一种可能性是 cpp 文件根本未被编译。可以在 cpp 文件中加入消息 pragma,以确认它们是否被编译:


#pragma message( "正在编译 " __FILE__ )

还可以检查构建目录中是否有与 cpp 编译单元相关的目标文件。


#4


可以使用预处理后的 cpp 文件(所有包含和宏展开后的阶段)来诊断问题。在 VS 2008 中,右键单击解决方案资源管理器中的文件 -> 属性 -> C++ -> 预处理器,设置“生成预处理文件”为“带行号 (/P)”。然后再次右键单击文件并选择“编译”。这将在 cpp 文件所在的同一目录中生成扩展名为 .i 的文件。打开该文件查看实际包含的头文件。


此方法对于解决复杂的编译问题非常有用,例如系统头文件中的宏替换了代码中的某些内容。


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • andr ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 树莓派摄像头配置与应用指南
    本文详细介绍了如何在树莓派上配置和使用摄像头,包括启用摄像头接口、简单的图片和视频捕捉方法以及如何通过网络实时传输视频流。 ... [详细]
author-avatar
sdfqw4543gf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有