Advertisement

C++,C 编译问题汇总(持续更新)

阅读量:

预设一个表达式。
后续操作中,在第16个定义块中添加了一个分号。
解决方案:应从所宏定义的语句中移除分号。

  • 找不到标识符
    意思:没找到对应的函数
    原因:

敲重点

复制代码
    #ifndef 宏1
    #define 宏1
    
    #include xxx
    void xxx
    
    #endif
    
      
      
      
      
      
      
      
    
    AI写代码

这么做的目的是为了避免重复编译,比如我在头文件a.h中加上

复制代码
    #ifndef  A_H //如果没有定义A_H
    #define A_H  //那就定义一个A_H
    xxx
    #endif
    
    
      
      
      
      
      
    
    AI写代码

这样,在编译过程中不会重复处理同一份代码(因为第一次编译已经生成了宏定义A_H)。但是,在b.h中也误写了同样的代码#ifndef A_H(应更正为B_H),这会导致该文件无法被正确编译。

  • 无法确定符号xxx的确切定义
    原因不明
    解决方法:
  1. 将方案关闭掉
  2. 删除相关文件夹中的.sdf文件
  3. 重新启动方案管理界面

不可解析的外部符号函数名为_snprintf存在。
原因如下:
在Linux操作系统中,默认情况下sprintf()函数会在返回值后自动附加字符'/0'以标识字符串结束位置;同时,在复制字符时所使用的字符串长度也会包含'/0'这一额外字符。
而在Windows操作系统及其开发环境中,默认情况下使用的是不可见内部调用接口(API),其名称为/_snprintf(在C语言中表示为_snprintf),该接口并未按照Linux系统的方式自动附加'/0';此外,在Windows环境下指定复制长度时也不包括'/0'这一尾随零字符。
解决方案:
由于sprintf()不是一个标准C/C++定义的标准库函数,在多数编译器中均未定义该接口;但在GCC编译器系列中,默认命名空间下的函数名称为sprint();而在VS开发环境中则称为/_snprintf(在C语言中表示为*_sn printf*)。
因此,在实际应用开发过程中应当采用以下措施:

  1. 在需要使用标准库字符串操作功能时应采用相应标准接口实现;
  2. 在GCC编译器环境下可以直接使用默认命名空间中的sprint()函数;
  3. 在非GCC编译器环境下建议手动实现类似功能;
  4. 或者在预处理阶段引入自定义实现代码块以解决兼容性问题;
  5. 另一种可行的方式是在编译选项中加入相应的链接引用声明以支持非标准库接口实现;
  6. 最后也可以通过编写自定义API来模拟所需的功能特性并完成相关操作;
  7. 这些措施均可满足不同开发环境下的具体需求
复制代码
    #if _MSC_VER
    #define snprintf _snprintf
    #endif
    
      
      
      
    
    AI写代码

_MSC_VER 是 微软公司在 开发 C/C++ 编译器 时 , 在 ANSI/ISO C99 标准 基础上 增加了 宏定义 功能 以 支持 当前 微软公司的 编译器 主版本 。

无法生成lib
在包含lib时会报错:无法定位指定的lib文件
深入原因尚不明确
解决方案:通过右键菜单快速操作
具体步骤如下:

  1. 右键工程菜单 -> 添加项 -> 新建模块定义(.def)文件
  2. 命名为任意名称即可
    完成编译后会自动生成新的.lib文件
    之后无需保留临时构建的模块定义文件
    (来自<>)

全部评论 (0)

还没有任何评论哟~