【问题标题】:How to define a constant in C++?如何在 C++ 中定义常量?
【发布时间】:2014-09-05 10:41:59
【问题描述】:

我通过 Mingw 在 Windows 上编译了一个 linux 程序。然而,转换并不完美。 例如,在 Windows 上,输出是这样的(我得到的是 'zu' 而不是实数):

Approximated minimal memory consumption:
Sequence        : zuM
Buffer          : 1 X zuM = zuM
Table           : 1 X zuM = zuM
Miscellaneous   : zuM
Total           : zuM

事实证明,Mingw 不支持 %zu,但它提供了一种解决方法。他们在web site 上说:

由于您使用的是 Microsoft 的实现,因此这永远不会起作用。 直接使用mingw_printf或者之前定义USE_MINGW_ANSI_STDIO为1 包括 stdio.h。

所以,我在我的程序中进行了搜索,发现 cdhit-common.h 是唯一具有 #include 行的文件。所以,我在该行上方定义了 USE_MINGW_ANSI_STDIO 并编译:

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdlib>
#define USE_MINGW_ANSI_STDIO 1
#include<stdio.h>
...

它编译但程序仍然输出'zu'而不是数字。我所做的一切好吗?为什么没用?

注意:使用 USE_MINGW_ANSI_STDIO 的解决方案适用于 mingw64,而我使用的是 mingw。我希望这两个平台都适用。

【问题讨论】:

  • 我猜&lt;iostream&gt; 包括&lt;stdio.h&gt; 在你做之前,移动#define USE_MINGW_ANSI_STDIO 1 之前&lt;iostream&gt;

标签: c++ linux gcc mingw


【解决方案1】:

我现在设法用谷歌搜索的宏是:__USE_MINGW_ANSI_STDIO。试试看。

【讨论】:

  • 是的,查看 HTML 源代码表明,在 OP 中链接到的 SourceForge 错误页面应该说 “在包含 stdio.h 之前直接使用 __mingw_printf 或将 __USE_MINGW_ANSI_STDIO 定义为 1。 "__ 字符被转换为&lt;strong&gt; 标记并且不可见
  • 耶稣!这就是你如何浪费 1 天时间来处理一个“小”HTML 错误!抓到乔纳森和捕食者!
【解决方案2】:

您正在设置预处理器标志。这意味着当编译器读取&lt;stdio.h&gt; 时,它会将USE_MINGW_ANSI_STDIO 设置为1。这可能会在编译器指令#if#ifdef 中使用。

通常最好将这些标志放入您的编译标志中,例如

-DUSE_MINGW_ANSI_STDIO=1 而不是进入代码。

(注意:可能是-D__USE_MINGW_ANSI_STDIO=1

如果您确实将其放入代码中,也可以这样做

  • 在始终包含在其他任何内容之前的标头中,例如一些“平台相关”的标题。
  • 在您的文件中包含任何其他内容之前。

C++ 流式传输头之一可能使用&lt;stdio.h&gt; 实现

【讨论】:

  • 我更改了文件。我是否必须做其他事情(删除一些由编译器生成的中间编译/二进制文件)还是足以“制作”?
  • 如果你改变你的 makefile cpp 标志,它应该重新制作你的所有目标,但为了安全起见,首先值得 make clean。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2011-10-17
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多