【问题标题】:Why a build is succesful even if an identifier is unresolved?为什么即使标识符未解析,构建也会成功?
【发布时间】:2021-10-28 15:59:40
【问题描述】:

我在代码中使用了snprintf指令:

snprintf(debugstr, sizeof(debugstr), "FW: %s ver %s\r\n", FW_NAME, FW_VERSION);

我正在使用带有编译器 XC16 v1.31 的 MPLAB IDE,并在项目属性部分启用了“使用旧版 libc”选项。 当我构建项目时,我收到消息:“BUILD SUCCESSFUL (total time: 104ms)”。

但是,在编辑器窗格的源 .c 文件中,当我将鼠标指针移到上述代码行号上时,会显示一条错误消息:“无法解析标识符 snprintf”(请参阅​​随附的图像) .

我的问题是: 项目成功构建并同时出现未解决的标识符错误消息是否正常?为什么?

感谢您的关注!

G

【问题讨论】:

  • 也许打开所有编译器警告?它必须假设snprintf() 是一个没有原型的函数,并将找到它的工作留给链接器。 注意编译器创建的错误假设代码可能(将会)错误地与预编译的库代码交互。
  • #include <stdio.h>了吗?
  • 顺便说一句:snprintf() 是随 C99 引入的,它在 C89/C90 实现中可能不可用/klonky。
  • XC16 文档 (link) 说:“1.3.1 ANSI C 标准 [...] 编译器符合 ANSI 定义的 ANSI C 标准规范 (ANSI x3.159-1989) [...]" ... 所以你有一个 C89 编译器和一个 C99 库。祝你好运 :-) 我建议你保留该语言的 C89 子集。
  • 发现 this interesting document about C89 以及与 C95/C99/C11 的差异。

标签: c printf identifier


【解决方案1】:

来自 snprintf() 的 MAN 页面

snprintf(), vsnprintf():
_XOPEN_SOURCE >= 500 || 
_ISOC99_SOURCE || 
/* Glibc versions <= 2.19: */ _BSD_SOURCE

所以你需要用以下方式开始你的源文件:

#define _BSD_SOURCE

【讨论】:

  • 非常感谢您的回答,您的回答听起来很有趣且很有希望。但不幸的是,它并没有解决问题,也没有在我的源代码中包含 :“无法解析标识符 snprintf”仍然存在。奇怪的是,尽管如此,FW 似乎工作正常,并且在另一个源文件(不是主文件)上的相同指令没有给出任何错误消息!成功构建项目并同时显示错误消息非常烦人(而且有点可疑)......
猜你喜欢
  • 2011-08-22
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
相关资源
最近更新 更多