タグ

C++に関するmizdraのブックマーク (38)

  • Try to make a try !

    各位,今年もC++ Advent Calendar 2023にご参加いただきありがとうございます! 今年はなんか数ヶ月単位で労基も真っ青な過酷な労働を強いられてしまい,全くAdCについて気にかける(カレンダーの余白を眺めて宣伝する,記事を読んで感想を書くなどする)余裕がありませんでした…(普通に過労死ラインに乗ってしまったし案の定心療内科通いになっちゃったぐらいなので,ここ暫くは自身の生死や体調・今後しか気にかける余裕がなかった) そんな中,(当に全く経時で追えてないので「今日空いてんじゃん,記事書くか…!」していただいた方々も何人かいらっしゃったかもしれませんが)ちゃんとカレンダーが埋まったことはとてもありがたいことです. 皆様当にありがとうございます. 過去2年間続けてきた感想ツイート(2021,2022)についてですが,記事執筆がだいぶ遅れてしまったこと,年末バタバタする等の理由

    Try to make a try !
    mizdra
    mizdra 2024/01/05
  • 契約に基づくプログラミング - cpprefjp C++日本語リファレンス

    概要 C++20では、いわゆる契約プログラミングがサポートされる予定であったが、C++23以降へ延期された。 以下の内容はC++20で予定されていた仕様に基づいており、今後変わる可能性が高い。 例 #include <iostream> #include <cmath> double sqrt_checked(double x) [[expects: x > 0]] // 引数に対する事前条件 [[ensures r: r > 0]] // 戻り値に対する事後条件 { return std::sqrt(x); } int main() { double x; std::cin >> x; [[assert: x > 0]]; // アサーション double y = sqrt_checked(x); std::cout << y << '\n'; } 仕様 契約属性 契約は属性として記述す

    mizdra
    mizdra 2022/07/26
  • UndefinedBehaviorSanitizer — Clang 18.0.0git documentation

    UndefinedBehaviorSanitizer¶ Introduction¶ UndefinedBehaviorSanitizer (UBSan) is a fast undefined behavior detector. UBSan modifies the program at compile-time to catch various kinds of undefined behavior during program execution, for example: Array subscript out of bounds, where the bounds can be statically determined Bitwise shifts that are out of bounds for their data type Dereferencing misalign

    mizdra
    mizdra 2022/05/12
    clang、実行時に未定義動作を検出するための、コード変換やカスタムランタイムの差し込みをするコンパイルオプションが用意されてるのか
  • 開発イテレーション偏重 - 兼雑記

    開発イテレーションを早くすれば、かなりの問題が勝手に解決される、と信じています。なんか最近、他の要素を軽視しすぎていたり、特にイテレーション速度に影響しなさそうなことすらしている気がしていて、信仰とかのレベルかもしれない、という気がしてきたので、ちょっと書いてみようかなと。主に C++ の話です。 仕事とかしてると良い判断力が求められたりしますが、判断というのは結構難しいですよね。アプローチ A と B で悩んだ時に、手が速ければ両方できたりします。開発イテレーションを無限に速くすると、必要とされる判断力はゼロに漸近していきます。やったね。 2手で変更の正当性を高速に確認できるようにする make (かその他のビルドコマンド)てやったらビルドができて、 make check (かその他のテストスクリプト)てやったら遅くないテストが全部走る、という体勢が好きです。試すためにはあっちのディレク

    開発イテレーション偏重 - 兼雑記
  • Using WebAssembly threads from C, C++ and Rust

    Learn how to bring multithreaded applications written in other languages to WebAssembly. WebAssembly threads support is one of the most important performance additions to WebAssembly. It allows you to either run parts of your code in parallel on separate cores, or the same code over independent parts of the input data, scaling it to as many cores as the user has and significantly reducing the over

    Using WebAssembly threads from C, C++ and Rust
  • なぜCを学ぶべきなのか - 立命館大学情報理工学部セキュリティ・ネットワークコース プログラミング言語サポートページ

    プログラミング言語としてのCは、初学者にとっては難しい言語であるのは確かです。中には、初心者が学ぶべき言語ではないと言い出す人もいます。ですが、私たちセキュリティ・ネットワークコースの教員は、我々のコースの学生は早期にCを学ぶべきであると考え、このカリキュラムを設定しています。以下に理由を列挙します。 Cはコンピュータの構造に深く根ざした言語なので、コンピュータそのものの学習を同時に進めることで、相互の理解が深まると考えています。例えば主記憶(メモリ)上にプログラムとデータの双方が置かれるフォン・ノイマンアーキテクチャや、メモリ上のデータ配置の問題、エンディアンの問題などを直接感じられるのはCならではだと思います。 CはOSや、コンパイラなどの言語処理系、組み込み機器などで広く使われており、その構造や動作と深く関わっているため、セキュリティとネットワークの理解のために欠かせないからです。

    なぜCを学ぶべきなのか - 立命館大学情報理工学部セキュリティ・ネットワークコース プログラミング言語サポートページ
    mizdra
    mizdra 2020/05/26
    良い
  • GitHub - vgvassilev/cling: The interactive C++ interpreter Cling

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

    GitHub - vgvassilev/cling: The interactive C++ interpreter Cling
    mizdra
    mizdra 2019/11/26
    C++のREPL
  • C++11で覚醒した共用体の話

    はじめに KMC 2回生のhatsusatoです。コミケまでもう1週間もないんですね1。27日まで授業があるとか正気の沙汰じゃない。 この記事は KMC アドベントカレンダー 2013 の 23 日目の記事です。昨日の記事は DtYaZsK 君の C++11超入門 でした。 今日は昨日に引き続いてC++11に関するお話です。 C++11で覚醒した共用体の話 共用体はたいていのC言語の入門書に載っている(と思う)ので、C言語をひと通り勉強した人なら共用体を知っていると思います。共用体はC言語の持つ低レベルなメモリ操作能力の一翼を担っています。しかし、共用体を実際に利用することは非常に稀でしょう。 実はこの共用体が、C++11での仕様変更によって生まれ変わりました。今回はそんな共用体にスポットライトを当ててみます。 共用体の基 まず、C++11で共用体がどうなったのかを見る前に、これまでの共

    C++11で覚醒した共用体の話
  • 標準C++規格が3年おきに制定される理由

    現在、C++の標準規格は3年おきに制定されている。このスケジュールはC++14から厳しく守られていて、C++20は2020年に制定される予定だ。 なぜなのかを議長のHerb Sutterが解説している。 Draft FAQ: Why does the C++ standard ship every three years? – Sutter’s Mill まず現状認識として、C++の標準規格は3年おきに制定される。ドラフトにバグがあるので遅らせるべきではないのか。ダメだ。そのために2年間の機能追加と1年間の機能フリーズとバグ修正の期間が儲けられている。 しかし、ある「機能」はあと数回の会議を経たならば完全に合意できて入れられる状態になっている。この「機能」のためにC++20を少しだけ遅らせられないのか? ダメだ。期限までにC++20に入れられない「機能」はC++23に回される。 このスケジ

    mizdra
    mizdra 2019/07/17
  • void でキャストすることで "unused" の警告を回避する - Secret Garden(Instrumental)

    元々は C言語?で使われているようなハックらしいのですが、知らなかったので覚書。 さて、例えば次のように関数の引数を assert チェックしてる関数があるとします。 void func(int value){ assert(value == 42); } この場合、デバッグビルドでは問題ないんですがリリースビルドでは『assert で参照してる value が使用されていない』とコンパイラが判断して、 warning: unused parameter 'value' [-Wunused-parameter] という風な警告を出す可能性があります。 このような場合、次のように void でキャストして回避することが可能です。 void func(int value){ (void)value; assert(value == 42); } たまに (void)xxx; しているコードを見

    void でキャストすることで "unused" の警告を回避する - Secret Garden(Instrumental)
    mizdra
    mizdra 2019/03/31
  • インクルードガードとpragma once - にゃははー

    C++ Advent Calendar 2015の5日目です。 前C++時代から近代C++に至るまで、ヘッダファイルの重複インクルード排除のために通称インクルードガードというものが使われてきました。 #ifndef YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H #define YOUR_VERY_VERY_AWESOME_LlBRARY_HEADER_H #endif // YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H しかしこれはファイルの前後に書かないといけないという制約や、他のヘッダとトークン列が一致してしまうと意図せずヘッダがインクルードされないという問題がありました。 これに対してたった1行で書いて終わりの#pragma onceは、標準化を求める声も多く、目的が明確で、実装もあるにも関わらず、標準に入る気配すら

    インクルードガードとpragma once - にゃははー
    mizdra
    mizdra 2019/03/24
  • Compilation database

    mizdra
    mizdra 2019/03/23
    compile_commands.jsonを生成する方法一覧
  • Big Sky :: clangd を使う時に便利なコマンド compiledb

    先日、Go Advent Calendar の記事の中で Language Server について書きました。 Big Sky :: gocode やめます(そして Language Server へ) はじめに まず始めに言っておかなければなりません。 gocode 今まで当にありがとう この記事は、Go 言語歴10年になる僕がこれまで愛用してきた Go 言語のコード補完ソフトウェア gocode... https://mattn.kaoriya.net/software/lang/go/20181217000056.htm 僕は Vim を使っていて、幾らかの言語の開発環境は vim-lsp に移行できたのですが C/C++ を扱うケースだけ vim-lsp に移行できず vim-clang を使ってきました。C/C++ は clangd という Language Server を使

    Big Sky :: clangd を使う時に便利なコマンド compiledb
  • C言語の正しいヘッダファイルの書き方 - saito’s blog

    最近、仕事でC言語での組み込み系の開発に携わっています。 開発中のコードを眺めていると、ヘッダファイル内にstatic関数のプロトタイプ宣言を記述していたり、ヘッダファイル内で不必要に他のヘッダファイルをインクルードしているなど、ヘッダファイルの書き方が分かっていないと思われる箇所が多々見られました。 実際、C言語の入門書でもヘッダファイルの書き方を詳しく説明しているものは、僕の知っている限りでは存在しないので、C言語を使っていてもヘッダファイルの正しい書き方を知らない人が少なくないのではないかと思われます。 そこで、このエントリでは、C言語のヘッダファイルの書き方について、僕が知っているテクニックをまとめてみました。 インクルードガードを書く ヘッダファイルファイルで他のヘッダファイルをインクルードしていると、いつの間にか同じヘッダファイルを2回インクルードしてしまうことがあります。 例

    C言語の正しいヘッダファイルの書き方 - saito’s blog
    mizdra
    mizdra 2019/03/22
  • clangd導入メモ - Qiita

    clangdとは clangのLanguage Server Protocol 実装。 LSPはMicrosoftが提唱しているIDE支援のための統一プロトコル。 Language "Server"とあるとおり、言語支援のためのサーバーが常駐する。この手の機構を個別に備えた言語として、TypeScriptのtsserverとか、C#のOmniSharpなどが挙げられるけど、それの汎用版。 clangdはLLVMのフロントであるclangをベースとしたサーバーで、LLVMプロジェクトが公式に開発している。 コンパイラなので、コンパイルエラーの検出はもちろん、コード補完やフォーマット、定義ジャンプと参照元ジャンプ等には対応している。 なので、clang-formatやRTagsといったclang系ツールも、LSPクライアントを導入してしまえば、これらの個別設定をしなくてよい。 clangdのイ

    clangd導入メモ - Qiita
  • Makeでヘッダファイルの依存関係に対応する - wagavulin's blog

    CやC++で書かれたプログラムをMakeを使ってビルドする、というのはUnix/Linuxではよく行われていることだが、ちゃんとしたMakefileを書くのは意外と難しい。 例えば以下の3つのファイルからなるプログラムを考える。 foo.h: 関数fooの宣言がある。 foo.c: 関数fooの実装がある。 main.c: 関数fooを呼び出す。 /* foo.h */ void foo(int a); /* foo.c */ #include "foo.h" #include <stdio.h> void foo(int a){ printf("%d\n", a); } /* main.c */ #include "foo.h" int main(int argc, char **argv){ foo(10); return 0; } Makefileは例えば以下のように書ける。 PRO

    Makeでヘッダファイルの依存関係に対応する - wagavulin's blog
  • シンプルで応用の効くmakefileとその解説 - URIN HACK

    makefileは一度作るとそれ以降編集する機会が少なくなるので意外と真面目に考える人は少なく、ネット上でもまとまった情報は多くない。 Linux系OS上(正確に言うとGNU MakeとGCC)で複数のC/C++ソースファイルから1つの実行ファイルを作成(make)するための汎用的なmakefileテンプレートを作った。名前はまだない。適宜ディレクトリ構成や設計などに従ってmakefileをカスタマイズする必要があると思うがそのベースにする。 このmakefileのいいところ コンパイル対象となるソースファイルをワイルドカードで指定できる。 ヘッダファイル、ライブラリ、オブジェクトファイルなどコンパイル、リンクに関連するどのファイルが外部で変更されていてもきちんと 差分 コンパイルされる。 makefile自体に説明書(この記事)がある。 makefile Gistはこちら。 COMPIL

  • GCC拡張の無効化 (と、それにまつわる細かい話) - 簡潔なQ

    端的に言えば-pedantic-errorsを使えばよい。(できれば-std=...も併用したほうがいいだろう) 以下解説 GCCのC/C++コンパイラは、独自の拡張機能を導入している。これを無効化するオプションには2種類あり、意味が異なる。 C標準と矛盾する拡張機能を無効化する。 (C標準と矛盾しないかもしれない)拡張機能を無効化する/または警告を出す。 実は、C言語の規格は、それぞれのコンパイラの拡張機能を全面的に禁止しているわけではない。「正しいプログラム(strictly conforming program)を正しく動かす」ことさえ満たせばいいので、いくつかの拡張機能が有効化されたままでも、標準に準拠していると言える場合があるのだ。 C標準と矛盾する拡張機能を無効化する C標準と矛盾する拡張機能を無効化するには、 -std オプションでISO C/C++を指定すればいい。 C D

    GCC拡張の無効化 (と、それにまつわる細かい話) - 簡潔なQ
    mizdra
    mizdra 2019/03/22
  • std::vector::operator[]に範囲チェックを追加するヘッダ - 簡潔なQ

    STLのstd::vectorの配列アクセスはat()とoperator[]があって、at()でないと範囲チェックをしないんだけど、at()とかコードが気持ち悪くなるので使いたくない。あと僕にはわからないが速度の問題が気になる人ももしかしたらいるかもしれない。デバッグの必要があるときだけ範囲チェックがあればいいと思った。 しかし、なんかそういうオプションがもとのvectorヘッダには無さげで、うまいことvector自身に設定するのは無理っぽそうなので、ラッパークラスを作ってdefineで置換するなどといった気持ち悪いことをしてみた。 デバッグでちょっと利用するには便利だと思う。 qnighy's gist: 177434 — Gist /** * dvector.h * * #include "dvector.h" * * then std::vector::operator[] seem

    std::vector::operator[]に範囲チェックを追加するヘッダ - 簡潔なQ
    mizdra
    mizdra 2019/01/30
  • C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita

    C++で副作用のない無限ループを書くと未定義動作になります。 「未定義動作」というのは口に出すだけでC++プログラマーを震え上がらせる力を持った言葉です。「鼻から悪魔が出てくる」という言葉で説明されるように、未定義動作を含むコードを実行した結果は何も保証することができず、バグの発見やデバッグすら困難にさせます。未定義動作下においてはコンパイラの気分によってコード片が消え、trueとfalseが同時に成立し、タイムトラベルを引き起こします1。 そのためC++ではうっかり未定義動作が埋め込まれないよう注意が払われるのが普通です。 さて、以下のC++のコードは未定義動作を引き起こします。 下の例は実際にclang/LLVMで最適化を有効にしてコンパイルするとでたらめな値を返す関数ができました。 この話をしたところ、何人かに驚かれたり異論を受け取ったりしたので、この話題について少しまとめてみました

    C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita