模块中的自定义 C++ 异常可以在 GCC (14.2.0) 中工作吗?

问题描述 投票:0回答:1

C++ 模块是否在 GCC 中实现,以便我可以在模块中创建自定义异常以在另一个文件中使用?我通过 MinGW/MSYS 使用 GCC 14.2.0 时收到以下错误:

 x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts -x c++-system-header -c cstdint variant exception
x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts -lstdc++ -x c++ -c error.cppm -o error.o
x86_64-w64-mingw32-gcc -std=c++23 -fmodules-ts error.o main.cpp -lstdc++ -static-libstdc++ -o test.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccztFNJq.o:main.cpp:(.text+0x0): multiple definition of `Crash@Error::~Crash()'; error.o:error.cppm:(.text$_ZNW5Error5CrashD1Ev[_ZNW5Error5CrashD1Ev]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\msys64\tmp\ccztFNJq.o:main.cpp:(.text+0x2e): multiple definition of `Crash@Error::~Crash()'; error.o:error.cppm:(.text$_ZNW5Error5CrashD0Ev[_ZNW5Error5CrashD0Ev]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

如果我显式地为

Crash
创建默认或空的析构函数,错误不会改变。

异常是根据此文件创建的:

错误.cppm

export module Error;

import <cstdint>;
import <exception>;

export enum class ErrorCode: uint8_t {
    INVALID,
    PROBLEM1,
    PROBLEM2,
};

export class Crash: public std::exception {
    public:
        Crash(ErrorCode crashCode) noexcept: code(crashCode) { }

    private:
        ErrorCode code;
};

我用来测试的主文件只是抛出异常。

主.cpp

import Error;

int main() {
    throw Crash(ErrorCode::PROBLEM1);
}

这只是我还不能做的事情,还是我在代码中犯了根本性错误?难道是因为我没有把模块代码放到命名空间中?

c++ exception gcc c++-modules
1个回答
0
投票

您的代码看起来不错,并且正在 64 位 Debian 上使用 g++ 14.2 进行编译、链接和正常工作。

您的问题很可能是 MinGW/MSYS 特有的,您应该向他们报告错误。

© www.soinside.com 2019 - 2024. All rights reserved.