【问题标题】:Is there a function which can be compiled with the specific compiler?有没有可以用特定编译器编译的函数?
【发布时间】:2021-02-16 08:18:27
【问题描述】:

由于我不确定是否可以将书中的示例代码贴在这里,请让我用普通话解释一下。

我正在学习 C 并尝试了我教科书中的一些代码,其中包含 strerrorlen_s()strerror_s()。当我在 macOS 上使用 clang 编译代码时,我遇到了错误,说函数 'strerror_s'/'strerrorlen_s' 的隐式声明在 C99 中无效。

看来这本书的作者用visual C++编译了代码,我猜我得到了错误,因为我使用了不同的编译器。我猜对了吗?

如果从教科书中发布示例代码没有法律问题,请告诉我,您希望我这样做。我会添加代码。

感谢您的宝贵时间。

【问题讨论】:

  • 看起来它在C11 中有效,尝试过使用它吗?
  • 您可以通过 strdup(strerror()) 修复此问题,只需对周围的代码进行一些更改。
  • @RandomDavis 我尝试使用 -std=c11 标志进行编译,但失败了。

标签: c visual-c++ clang


【解决方案1】:

与您使用与作者不同的版本 C++ 相比,编译器问题的可能性更小。再读一遍书的开头。会有一个介绍或前缀,表明作者使用的 C++ 版本。

【讨论】:

    【解决方案2】:

    你基本上是正确的。

    strerrorlen_s() 和 strerror_s() 是 C11 函数:https://en.cppreference.com/w/c/string/byte/strerror

    您的 Visual Studio 编译器支持它们,而您的 MacOS 编译器显然不支持。

    建议:Google 搜索“C11 支持 MacOS”以查看哪些编译器支持 C11 以适应您的特定环境。例如:

    How to compile C++ with C++11 support in Mac Terminal

    正如其他人指出的那样,您应该使用 clang++ 而不是 g++。 此外,您应该使用 libc++ 库而不是默认库 libstdc++;包含的 libstdc++ 版本已经很老了,而且 因此不包含 C++11 库功能。

    clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp
    

    如果你还没有安装 Xcode 的命令行工具,你可以运行 编译器和其他工具,而无需使用 xcrun 工具。

    xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp
    

    此外,如果您想要禁用特定的警告,您可以通过 编译器的附加标志来执行此操作。在警告结束时 消息它向您显示可以启用的最具体的标志 警告。要禁用该警告,请在警告名称前加上 no-。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多