タグ

cppに関するreboot_inのブックマーク (3)

  • C++のマングルとextern "C" { - wagavulin's blog

    C++とCが混在したプログラムを書くとときどき定義したはずの関数がundefinedだと言われることがある。そんなときの対処法とマングルの話。 その前にまずはC言語だけの場合を考える。例えば以下のようなCのプログラムを書いてみる。 /* main.c */ #include "foo.h" int main(){ func1(); return 0; } /* foo.h */ #ifndef FOO_H void func1(); #endif /* foo.c */ #include "foo.h" #include <stdio.h> void func1(){ puts("ok"); } 見てのとおり、main.cはfunc1関数を呼び出しており、foo.cはfunc1関数を定義している。当然、main.cをコンパイルしてできたmain.oもfunc1を参照し、foo.cをコンパイ

    C++のマングルとextern "C" { - wagavulin's blog
  • C言語のインクルードガードはpragma onceを使う - C言語入門

    インクルードガードとは、ソースコードのinclude処理が重複して発生することを防ぐためのものです。C言語では、define/ifndefのプリプロセッサディレクティブを利用して、インクルードガードを実現していました。処理系の拡張により pragma once が追加されました。 読み方 pragma once ぷらぐま わんす インクルードガード いんくるーどがーど include guard いんくるーどがーど 概要 C言語のプリプロセッサ(cpp) は、プリプロッサディレクティブ の include が出現するたびに、ヘッダファイル(.h)を展開しようとします。 インクルードガードは、ヘッダファイルの相互インクルードで無限ループに陥ることを防ぐことができます。ただし、defineの重複を排除することができないため、思わぬ副作用を産んでしまうこともありました。 何度もインクルードするこ

    reboot_in
    reboot_in 2020/10/30
    “インクルードガードとは、includeディレクティブによる相互インクルードの無限ループを防ぐために利用されます。 C言語では、インクルードガードは pragma once を利用します。”
  • C++11で正規表現(std::regex)を使う - Qiita

    (例)「int」「double」「char[20]」などの文字列に対して、 (int)、(double)、(char)[(20)]のように、型名と配列数をサブグループとして取り出す正規表現 ややこしいのは"\\["、"\\d+"、"\\]"の部分。 C/C++の文字列でバックスラッシュ一文字を表現すると"\\"になり、 正規表現のメタ文字である'['をエスケープするためにこれを前に付けて "\\["となっている。その他も同様。 C++11で追加された生文字列リテラル「R"(〜)"」を使うと次のようにも書ける。 https://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#raw.string.literal #include <regex> #include <iostream> using std::string;

    C++11で正規表現(std::regex)を使う - Qiita
    reboot_in
    reboot_in 2020/09/29
    “ R"((int|double|char)(\[(\d+)\])?)"”
  • 1