【问题标题】:How to make sure code (c++) written in Xcode can compile on other platforms?如何确保用 Xcode 编写的代码(c++)可以在其他平台上编译?
【发布时间】:2014-09-26 05:17:37
【问题描述】:

我是一个初学者,正在尝试在 Xcode 上进行一些 C++ 编程。它工作正常,但是当我尝试使用 VS 在我的 windows pc 上编译相同的 c++ 文件时,出现了一些错误。仔细查看我的代码后,确实有一些愚蠢的错误导致了错误,但 Xcode 似乎忽略了它们......

我的问题是我需要更改任何设置以防止 Xcode 变得如此聪明吗?

例如,下面的代码实际上可以在xcode中编译:

#include <iostream>
using namespace std;

int main() {

    if (true or false){
        cout << "How is this possible? \n";
    }
    return 0;
}

还有其他情况下代码实际上是错误的,但它可以编译得很好是 Xcode 这是令人讨厌的部分,我想禁用它。

【问题讨论】:

标签: c++ xcode platform


【解决方案1】:

据我所知,您的代码没有任何问题。

ISO C++ 标准没有指定哪些标准头文件包含在其他标准头文件中。所以,Xcode直接或间接使用的iostream版本完全有可能包含ciso646。而 Visual Studio 的 iostream 版本不包括 ciso646。其他头文件也有很多类似的情况。您只需要阅读错误消息并意识到您的错误(当您将文件移动到不同的平台时)是由于缺少头文件。

【讨论】:

  • C++ 标准支持像or 这样的“替代标记”,没有标头&lt;ciso646&gt;。 C++ 指定此标头“无效”。 VS 应该支持没有此标头的替代标记,但不支持。
  • 它使用 /Za 开关来禁用 Microsoft 语言扩展。
  • @RetiredNinja 在 VS 中禁用扩展是个坏主意。 /Za 有问题,他们没有在 /Za 下测试他们的库实现。有些是行不通的。这是他们的一位工程师发来的消息:lists.cs.uiuc.edu/pipermail/cfe-dev/2012-June/021886.html
  • @bames53 我没有说它是好是坏,只是有可能。我认为在您的代码中使用 andor 是个坏主意,但人们会做他们想做的事。
【解决方案2】:

如果编写可移植代码意味着按照 C++ 标准规范编写代码,那就太好了,但不幸的是,情况并非如此。尽管在各种实现上有各种编译器选项可以帮助将不同的实现更紧密地结合在一起,但通常您只需将代码带入目标环境并在那里进行实际测试。

因此,最终编写可移植代码意味着您必须学习一些 C++ 子集,这些子集被您想要定位的所有实现所接受。


or 是 C++ 中的“替代标记”,VS 拒绝它是不正确的。 Xcode 中没有选项可以禁用对替代令牌的支持。但是 VS 对 or 使用标头 &lt;ciso646&gt; 的宏具有非标准支持,并且 Xcode 确实有一个标头 &lt;ciso646&gt; 什么都不做(如标准所指定)。因此,您可以编写使用 or 的代码,并通过包含此标头在 Xcode 和 VS 中工作。

#include <iostream>
#include <ciso646> // does nothing in Xcode, allows `or` in VS
using namespace std;

int main() {

    if (true or false){
        cout << "How is this possible? \n";
    }
    return 0;
}

很遗憾,VS 无法通过宏支持所有替代标记,因此 Xcode 仍将支持 VS 不支持的一些标记。


还有其他情况下代码实际上是错误的,但它可以编译得很好是 Xcode 这是令人讨厌的部分,我想禁用它。

如果你给出具体的例子,那么我可以提供关于如何编写可移植代码的额外建议。

【讨论】:

    【解决方案3】:

    我建议不要更改您的 Xcode 设置,而是使用另一个开发环境来交叉检查您的代码。

    如果您正在寻找便宜且功能齐全的产品。下载 VirtualBox Windows VM,然后运行下载 Dev C++ (bloodhshed)

    【讨论】:

    • Bloodshed Dev-C++ 是古老的并且在很多事情上都非常错误。使用它的唯一原因是班级评分员正在使用它进行评分。
    【解决方案4】:

    VS 不支持or:你需要使用|| 代替。

    您可以包含一些特殊文件,但它不会将or 注入到语言中,使其在所有情况下都可以正常工作。

    如果你想禁止使用or(并且你的编译器不支持更好的方法) #define 表示编译器错误,例如

    #define or OR
    

    这至少意味着编译错误的性质在 Xcode 和 VC 上是相同的。

    【讨论】:

    • 我知道,所以我想问如何在 Xcode 上禁用“或”的支持
    • VS 确实支持“或”。只需包含 .
    • 有(或曾经)很多情况下这不能正常工作。
    • 好吧,其实我认为我不需要在 VS 端进行任何修改。只是 Xcode 端导致了不报告错误的问题。
    • 问题是你认为上面的代码不正确,因为 Visual Studio 不会编译它,而实际上代码是正确的。事实上,您需要跳过一些障碍才能使其在 Visual Studio 中工作是 Visual Studio 的问题,而不是代码。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2017-11-09
    • 1970-01-01
    • 2016-02-03
    • 2023-04-06
    • 2020-01-31
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多