条件付きコンパイルでC++標準のバージョンを調べる方法

条件付きコンパイルで、C++標準のバージョンを調べるときは __cplusplus プリプロセッサマクロを使います

たとえば以下のコードは、c++のコンパイラが c++11 に準拠していない場合、コンパイルエラーとなります

#if __cplusplus < 201103L
#  error "C++11に対応していません"
#endif

C++標準と、値の対応関係は以下の通り

C++標準 値
C++11 201103L
C++14 201402L
C++17 201703L
C++20 202002L
C++23 202302L

linux 6.12.x で e1000e がフリーズする

linux 6.12.x に更新したところ e1000eのドライバが頻繁にフリーズするようになりました

症状としては

  • カーネルは linux 6.12.1 or linux 6.12.2
  • 突然,ネットワーク(有線LAN)の通信が出来なくなる
  • dmesg を見るとe1000eのドライバが エラーを出している
  • linux 6.11 に戻すと再現しない

dmesg のエラーはこういう感じです

e1000e 0000:00:1f.6 eth0: NETDEV WATCHDOG: CPU: 8: transmit queue 0 timed out 5304 ms

調べてみると,これはe1000eにあるTSO (TCP Segmentation Offload)関連の不具合で,パケットが大量に殺到すると e1000eのドライバがパンクするということのようです

正確な原因は不明ですが,以下のコマンドでTSOを無効にしたら,フリーズしなくなりました

$ sudo ethtool -K eth0  tso off

eth0 の部分はe1000eのデバイス名です.

正確な原因,対処方法は不明ですがとりあえずこちらに書いておきます