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 で場所指定すれば通るけどもっといい方法がありそうな。