【问题标题】:Code compiles in CLion but not in Command Prompt代码在 CLion 中编译,但不在命令提示符中
【发布时间】:2020-08-08 08:41:54
【问题描述】:

我正在尝试使用 C++ 库,并且需要(想要)使用嵌套命名空间以提高代码的可读性。但是,当我尝试在 Windows 命令提示符中使用 g++ main.c 编译我的代码时遇到了问题。

下面的代码是我将拥有的示例——一个嵌套的命名空间,然后是一些函数或类:

namespace gpc::warning {
    void raiseError() {
        std::cout << "Error...\n";
        exit(1);
    }
}

以下代码是我的main.c 文件的示例:

#include <iostream>
#include "Warning/raise.hpp"

int main() {
    std::cout << "Hello, World!" << std::endl;
    gpc::warning::raiseError();

    return 0;
}

当我在 CLion 中运行这个简单的问题时,它可以完美编译并运行,但是当我在 Windows 10 命令提示符中运行代码时,我收到以下错误,告诉我有关命名空间的一些信息:

In file included from main.cpp:2:0:
Warning/raise.hpp:10:14: error: expected '{' before '::' token
 namespace gpc::warning {
              ^
Warning/raise.hpp:10:16: error: 'warning' in namespace '::' does not name a type
 namespace gpc::warning {
                ^
main.cpp: In function 'int gpc::main()':
main.cpp:9:10: error: 'gpc::warning' has not been declared
     gpc::warning::raiseError();
          ^
main.cpp: At global scope:
main.cpp:12:1: error: expected '}' at end of input
 }
 ^

我想知道我做错了什么以及如何解决这个问题。

谢谢!

【问题讨论】:

  • 您是否检查过用于定义嵌套命名空间的语法是否与您的编译器版本兼容?参考资料:en.cppreference.com/w/cpp/language/namespace
  • 我使用 C++ 20,所以我认为 n1::n2 语法有效...
  • 您使用的是哪个 g++ 版本??分享以下命令的输出:g++ --version.
  • @Pencilcaseman 我认为 Windows 上可用的任何 g++ 编译器都不支持 C++20。
  • 显然我使用的是 g++ 版本 4.9.2,我认为这可能是问题

标签: c++ gcc namespaces command-prompt clion


【解决方案1】:

尝试将您的g++ 版本更新为6.1.0 或更高版本。

即使带有-std=gnu++17 标志,代码也不会在g++ v5.5.0 上编译。你可以检查here。 (原因:当时编译器不支持嵌套命名空间。)

代码应使用g++ v6.1.0 或更高版本的编译器默认值(不带任何标志)进行编译。你可以查看这个here

您可以通过在cmd 上运行:g++ --version 来检查您的编译器版本。

专业提示:找到 CLion 的编译器,如果是 g++,则将其添加到路径中。 (无需浪费互联网数据更新旧的g++ 编译器!)

【讨论】:

  • 我找到了c++.exe文件并将目录添加到PATH,但版本保持不变,除非我与c++.exe在同一目录中...
  • @Pencilcaseman 这可能是因为在 c++.exe 之上你有旧的 g++。将c++.exe 放在PATH 变量的顶部。 PATH 变量列表中的顺序很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多