【问题标题】:Why won't clang compile this source code that works in VS2012?为什么clang不编译这个在VS2012中工作的源代码?
【发布时间】:2014-01-19 11:13:59
【问题描述】:

我不知道我是否在这里做错了什么,但我一辈子都无法编译在VS2012 中可以正常编译的现有代码。

strsafe.hxstring 这样的包含会导致奇怪的编译错误,其中最奇怪的是标准包含文件中间的“缺少右括号”。不用说,没有缺少的括号。此外,move.h 导致铿锵声与

致命错误:函数声明符后的预期函数体。

像这样的保护子句

#ifndef _FUNCTIONAL_
#error Must include <functional>
#endif

即使包含了函数也会抛出错误。

我做错了什么?

【问题讨论】:

    标签: c++ compiler-errors clang


    【解决方案1】:

    回复

    “像 strsafe.h 和 xstring 这样的包含会导致奇怪的编译错误,”

    这些是 Visual C++ 头文件。

    clang 可能没有类似的东西。

    一个主要问题是您使用的是低级 C 字符串函数,微软(正确地!)认为这是有问题的,并且(错误地)认为您已被弃用。

    请改用std::string

    【讨论】:

      【解决方案2】:

      一个编译器包含的头文件通常是针对该编译器实现量身定制的,不一定能在不同的编译器上正常工作。

      所以一般来说,您将无法将 Visual Studio 附带的头文件与其他编译器一起使用。

      【讨论】:

      • 我对 Code::Blocks 不够熟悉,不知道为什么它没有被配置为正确使用 clang。也许问题是没有正确安装clang?就个人而言,我首先要确保您可以使用 clang 从命令行编译和运行“hello world”程序,以确保它已正确安装。这通常是我安装新工具时要做的第一件事;这就是“hello world”程序的用途。
      • 所以希望我将其移至聊天。呃,好吧。看来您对宏名称是正确的-这次不同。但这不是昨天(大概是因为它正在拉入 VS 标头)。所以......说你是对的,我应该从包含中包含在内。如何避免上述问题?
      • 此外,我想编写独立于平台的代码,可以使用任何功能齐全的编译器进行编译。我有的是一堆VS2012代码。
      • @SodAlmighty:不要使用您在问题中使用的保护子句,只需使用:#include &lt;functional&gt;functional 标头本身将确保它不会被多次包含,因此如果您的标头需要它,包含它通常没有害处。
      • 但是当包含我自己的标题而不是 时,这不起作用。并且#pragma once 或保护子句不会削减它。
      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多