Clang++ がヘッダを参照できない件

2025.05 現在、Clang++ が iostream を見つけられない。
iostream だけではなく C++ 標準ヘッダが参照できないようで。

まあバグだろうからすぐ修正されるだろう。
で、先日 CommandLineTools の更新通知がきた。
これで修正されて、って同じヤン。

15.4 から 15.5 にアップデートされてはいる。
小数点の無い MacOSX15.sdk は小数点付きへのリンクなのか。
アップデートに追従するみたいだから今後はこっち指定に。

ちなみにルートを Finder で開くには、端末を起動して。

open /

でイケます、GNOME の Linux なら gio open / ですね。
別にホームから command+up してもいいですけど、脱線でした。

そんなこんなで、ビルド毎に -I オプションなんてメンドイぞ。
なのでエイリアスを作ることに、修正されたら消せばいいだけだ。
~/.zshrc を開いて、作ってない人は作成して。

alias clang2="clang++ -I /Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/include/c++/v1"

名前は各自適当に、筆者は clang2 にしました。

普通にビルドできるようになりました。
ヘッダの場所は環境によって違うかもなので各自調べてね。

ついでに、clang 17 や gcc 15 は C++23 もいくつか対応なのね。

#include <print>

/**
 * clang2 -std=c++23 cc23.cpp
 * g++ -std=c++23 cc23.cpp
 */

int main (int argc, char const* argv[]) {
    /**
     * println なら改行付き、いらないなら print
     */
    std::println("最高な{0}は{1}です", "カメラレンズ", "パナライカ");
    return 0;
}

Java と C# のいいとこどりみたいなことしやがって。
でも思うんだ、名前空間の区切りはドットでよくね?

コンパイラの実装状況 – cpprefjp C++日本語リファレンス

凄いサイトがあるもんだ。

セッカリベンジ

本日も午前は雨予報、昼前には晴れるらしい。
ということで十時くらいまでのんびりして昨日の麦畑へ。

sekka

セッカのリベンジ成功、ノートリミングで縮小だけ。
残念ながらアクロバット開脚はしてくれなかったけど。

sekka

少し移動したので別角度、寄っても意外に逃げないな。
と思ったけど、この振り向いた直後に飛んでいきました。

hoojiro

目的は達成したので木曽川へ移動。
ホオジロが歌っています、あれもう子育て中じゃないの?

tonbi

トンビが低い所を飛んでいたので撮影したらカッコイイ背景に。
大きく撮るのもいいけどやっぱり背景はあったほうが絵になる。

tonbi

一番大きく撮れた奴、こういうのばかりじゃ飽きるよね。
ちなみにカラスに攻撃され逃げていきました、カラス強い!

他にホトトギスの声が何箇所かで聞こえたけど、姿は見えず。
木曽川の薮はウグイス大量ですしね、托卵は成功したのかな。
しかし「鳴かぬなら***ホトトギス」って言うけどさ。
特許許可局やかましいよ、アレ語呂が良かっただけなのかな。

一時間だけ

本日は雨予報、十時くらいから降り始めらしい。
一時間だけでもと前回セッカの声がしていた麦畑へ。
小雨になり諦めて鞄にカメラを戻したところで。
ヒッヒッヒッヒッヒッ、とセッカの声が。

sekka

あわててカメラを出しなんとか一枚撮れた!
今回も遠い、麦畑だしこれ以上寄れないし。
しかし麦の穂に普通に乗れるサイズなんだな。

小雨が強くなってきたので撤収。
帰りにセブンに寄ったらなんか凄い人が並んでいた。
あぁみそきんか、SNS 映えなのか転売なのか。
そういうのに興味がない人間で良かった。

キジ

今日は久々に五条川、と周辺の田圃へ。
セッカの声がする場所があるんだが、姿は見えず。

hibari

ヒバリのメスが発情したのかビービー鳴いています。
オスのほうが簡単に見つかるんだけど、豆粒にしか取れず。

kiji

キジ、母衣打ちしている所を撮ってみました。
この子は昨年三羽のメスを連れていたハーレム王かな?

kiji

メス連れではない時は結構ノコノコ出てきます。
薮がデカい木曽川では全然見つからないんですけどね。

murasakitsumekusa

いや今年こそ野鳥以外をとマクロレンズを買ったんだい。
ということでムラサキツメクサ、紫色のツメクサもあるんだね。

nayokusafuji

ナヨクサフジだと思う、どちらも五条川の土手にて。
結構綺麗だと思うんだけど遊歩道のジジババ誰も見ていない。

せっかく遊歩道を歩いているなら花とかも、って余計なお世話か。
そう思わせるサイトを作るのも面白そう、いやプログラミングは?
c23 c++20 はまだ検証中なのでもう少し待って。

C/C++ auto

gcc や Clang でのビルド方法ページを作っている筆者ですが。
ちょっと、いや数年サボっていたら C 23 や C++ 20 が出ていた。
流石に情報が古いので書き換えしようかと、てか調べないと。

C23 (C言語) – Wikipedia

ついに C 言語にも auto キーワードが、今頃知った。
いや C++ の柔軟な奴と違って変数宣言にしか使えないっぽい。
やってみないと断言できないので少し使ってみる。

#include <stdio.h>
#include <stdlib.h> // free
#include <string.h> // strdup

/**
 * gcc -std=c23 c23.c
 * clang -std=c23 c23.c
 */
int calc(int n) {
    return n * n;
}

int
main (int argc, char *argv[]) {
  
    // 静的文字列はイケる
    auto om = "OLYMPUS"  " " "Workspace";
    printf ("%s\n", om);
    // ポインタもイケる
    auto heap = strdup("おならプー");
    printf ("%s\n", heap);
    free(heap);
    // 計算値もイケる
    auto num = 3*5;
    printf ("%d\n", num);
    // 再代入も普通に可能
    num = 30;
    printf ("%d\n", num);
    // 関数の戻り値dでも可能
    auto num2 = calc(8);
    printf ("%d\n", num2);
    // ループがちょっとだけ簡易にできる
    char *l_mount[] = {"Leica", "Panasonic", "SIGMA"};
    auto count = sizeof (l_mount) / sizeof (l_mount[0]);
    for (auto i=0; i<count; i++) {
        printf ("%s\n", l_mount[i]);
    }
    // 配列自体は無理
    //auto num_array = {1, 2, 3};
    return 0;
}

gcc

配列もダメか、あんまり便利じゃないてかコレ意味あるの?
とにかく -std=c23 又は -std=c2x 指定はどちらでも使えました。

#include <iostream>

/**
 * Fedora 42 は普通にイケました
 * g++ -std=c++20 c23.cc
 * 
 * macOS ではエラーになったので、場所指定は人によって違うと思う
 * clang++ -I /Library/Developer/CommandLineTools/SDKs/MacOSX15.4.sdk/usr/include/c++/v1 -std=c++20 c23.cc
 */

auto
get_half(auto num) {
    return num / 2;
}
 
int
main (int argc, char *argv[]) {
  
    //char *l_mount[] = {"Leica", "Panasonic", "SIGMA"};
    auto l_mount = {"Leica", "Panasonic", "SIGMA"};

    for (auto obj : l_mount) {
        std::cout << obj << std::endl;
    }
    // 簡易オーバーロード
    std::cout << get_half(3) << std::endl;
    std::cout << get_half(3.0) << std::endl;

    return 0;
}

clang

C++ の auto はまさかのこんなことまで可能なのにね。
おまえは Python か、偽オーバーロードの中身はどうなっているのやら。
C++ でも stdio な某クソ OS はどうでもいいよね。

それより Clang が iostream を見つけてくれないんですけど。
macOS だけでなく Linux 版も同じみたいだけどバグなのか?
-I で場所指定すれば通るけどもっといい方法がありそうな。