質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

355閲覧

GCC で C++ のモジュールをテンプレートありで作りたい

Paalon

総合スコア263

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/05/25 11:08

GCC で C++ のモジュールをテンプレートありで作りたいです。
ヘッダーオンリーパッケージとして、以下のようなプロジェクト構成で

text

1$ tree . 2. 3├── hello 4│   └── greeting.hpp 5└── main.cpp 6 72 directories, 2 files

c++:hello/greeting.hpp

1#ifndef HELLO_GREETING_HPP_INCLUDED 2#define HELLO_GREETING_HPP_INCLUDED 3 4#include <print> 5 6namespace hello { 7 inline auto greeting(auto const & x) { 8 std::println("Hello, {}!", x); 9 } 10} 11 12#endif // #ifndef HELLO_GREETING_HPP_INCLUDED

c++:main.cpp

1#include <hello/greeting.hpp> 2 3int main() { 4 hello::greeting("C++"); 5}

次のようにしてコンパイル&実行:

bash

1g++-14 -std=c++23 -I . main.cpp -o main 2./main

できるものを C++20 で導入されたモジュールを使って作ろうと思って、以下のプロジェクト構成で

text

1$ tree . 2. 3├── hello.cpp 4└── main.cpp 5 61 directories, 2 files

c++:hello.cpp

1export module hello; 2 3import <print>; 4 5export namespace hello { 6 auto greeting(auto const & x) { 7 std::println("Hello, {}!", x); 8 } 9}

c++:main.cpp

1import hello; 2 3int main() { 4 hello::greeting("C++"); 5}

次のようにしてコンパイル&実行しようとしたのですが、

bash

1g++-14 -std=c++23 -fmodules-ts -x c++-system-header print 2g++-14 -std=c++23 -fmodules-ts hello.cpp main.cpp -o main 3./main

2行目で以下のエラーでコンパイルに失敗します。

text

1In file included from /usr/local/Cellar/gcc/14.1.0/include/c++/14/print:41, 2of module /usr/local/Cellar/gcc/14.1.0/include/c++/14/print, imported at hello.cpp:3, 3of module hello, imported at main.cpp:1: 4/usr/local/Cellar/gcc/14.1.0/include/c++/14/format: In instantiation of 'struct std::__format::_Runtime_format_string<char>': 5/usr/local/Cellar/gcc/14.1.0/include/c++/14/print:129:19: required from 'void std::println(format_string<_Args ...>, _Args&& ...) [with _Args = {const char (&)[4]}; format_string<_Args ...> = basic_format_string<char, const char (&)[4]>]' 6 129 | { std::println(stdout, __fmt, std::forward<_Args>(__args)...); } 7 | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8hello.cpp:7:21: required from 'auto hello::greeting@hello(const auto:1&) [with auto:1 = char [4]]' 9 7 | std::println("Hello, {}!", x); 10 | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ 11main.cpp:4:20: required from here 12 4 | hello::greeting("C++"); 13 | ~~~~~~~~~~~~~~~^~~~~~~ 14/usr/local/Cellar/gcc/14.1.0/include/c++/14/format:74:55: internal compiler error: Segmentation fault: 11 15 74 | template<typename _CharT, typename... _Args> struct basic_format_string; 16 | ^~~~~~~~~~~~~~~~~~~ 17Please submit a full bug report, with preprocessed source (by using -freport-bug). 18See <https://github.com/Homebrew/homebrew-core/issues> for instructions.

auto greeting(auto const & x) のところを void greeting(char const * x) と型指定するとコンパイル&実行できるのですが、auto だとうまくいきません。テンプレートありで作る方法を教えてください。GCC のバージョンは以下の通りです。

text

1$ gcc-14 --version 2gcc-14 (Homebrew GCC 14.1.0) 14.1.0 3Copyright (C) 2024 Free Software Foundation, Inc. 4This is free software; see the source for copying conditions. There is NO 5warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

internal compiler error というメッセージが出ています。 これは通常はコンパイラに問題 (バグ) があることを意味します。 プログラムに誤りが無くても現れることはあります。 コンパイラのアップデートがあればスルッと無くなることもあります。

発生に明瞭なルールがあるわけではないのでどのような状況で internal compiler error が起きて、どうやれば避けられるかは手探りで試すしか仕方ありません。 場合によってはある程度の条件を絞り込んだバグ報告が出ていることもあるかもしれませんがただの言語ユーザーとしてはコンパイラ内部の入り組んだ事情を把握して理解するのは困難なことが多いと思います。

モジュールは比較的に新しい機能なのでコンパイラの実装がこなれておらず、現時点ではあまり安心して使えません。

私が大雑把に試した感触ではおそらく println が書式文字列の解釈をコンパイル時にやるメカニズム (consteval 関連?) とモジュールの組み合わせを処理しきれていないように見えます。 モジュールを諦めるか、モジュールでやるなら std::printlnstd::format を諦めて std::cout<< で出力するかで一応はなんとかなります。

投稿2024/05/26 04:08

SaitoAtsushi

総合スコア5570

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Paalon

2024/05/26 05:24

新しい機能の勉強目的に加えて、実用に使えるかどうかの試験目的も兼ねていました。GCC の進化を楽しみに待ちたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問