この記事は、産技品川 Advent Calendar 2025 14日目の記事です。
はじめに
私は普段 C/C++ を使っているのですが、まだまだ初学者ということもあり、今年になって初めて使った書き方がいくつかありました。
今回は、その中から4つを紹介します。
1.ヌルポ回避
if(!a)
例えば、a というポインタ変数があり、それを参照する前に上記のような判定を書いていました。
当然、ポインタ変数に何も入れていないと未定義動作になる可能性はありますが、何もチェックしないよりはマシだと考えて入れていました。
クラスが外部からポインタを受け取る前提のコードを書いた際に、このような書き方をしていました。
2.NaN回避
if(a!=a)
通常、a == a は常に成り立つように思えますが、NaN (Not a Number) が入っている場合は例外です。
この性質を利用して、NaN かどうかを判定していました。
あらかじめ NaN を代入しておき、実行時に値がセットされていない場合に引っかかるような使い方をしていました。
今振り返ると、あまり良い方法ではなかったと思います。
3.アドレス直叩き
#define add32(add) ((uint32*) add)
マイコンの特殊レジスタのアドレスを直接指定したいときに使っていました。
PID を行うクラスに、エンコーダを読むペリフェラルの特殊レジスタのアドレスを渡す用途です。
(uint32*) にキャストしないとinvalid conversionするため、このマクロを使うようにしていました。
4.環境判別
#if __has_include("libname.hpp")
#include "libname.hpp"
#endif
自分用に軽いライブラリ的なものを作った際、実装を組み込み向けとハイレイヤー向けで分けるために使いました。
__has_includeはC++17以降でしか使えないため、C++17未満の環境にも対応させたいヘッダは、
1. __has_includeが使えるかを確認する
2. 使える場合のみ #includeする
3. 最終的にインクルードガードで定義されるシンボルの有無をdefined()や#ifdefで判定する
といった形で環境判別を行っていました。
おわりに
今回は、今年になって初めて使った C/C++ の書き方をいくつか紹介しました。
あまり綺麗な書き方でなく、有名なものも多いですが、実際に試行錯誤しながら使っていた例として、何かの参考になれば幸いです。