gcc や Clang でのビルド方法ページを作っている筆者ですが。
ちょっと、いや数年サボっていたら C 23 や C++ 20 が出ていた。
流石に情報が古いので書き換えしようかと、てか調べないと。
ついに 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; }
配列もダメか、あんまり便利じゃないてかコレ意味あるの?
とにかく -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; }
C++ の auto はまさかのこんなことまで可能なのにね。
おまえは Python か、偽オーバーロードの中身はどうなっているのやら。
C++ でも stdio な某クソ OS はどうでもいいよね。
それより Clang が iostream を見つけてくれないんですけど。
macOS だけでなく Linux 版も同じみたいだけどバグなのか?
-I で場所指定すれば通るけどもっといい方法がありそうな。