C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:
C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:
先に注意事項ですが、今回の話はC言語ソースのコンパイル結果、つまり「処理系での実現方法」の話であって、C言語そのものの決まりではありません。 ※C言語としての話と、コンパイル後のバイナリレベルの話を混同する人が山のようにいるので念のため angel (as ㌵㌤の猫) @angel_p_57 なんかふと思い立ってC言語コードのコンパイル結果を見てみたんだけど、不思議に思ったことが。 const修飾したオブジェクトって実質読み取り専用だから、メモリ上に置かれるとしたら rodata 等の書き込み不可領域になるんだけど。ところが auto変数 ( 要はレキシカルな変数 ) はそうならないようだ。 2023-07-29 21:12:41 angel (as ㌵㌤の猫) @angel_p_57 例えば static const char str[] = "…"; としてstaticなconst文字
C 言語 マクロ講座 # ## 編に触発されて、もうすこし悪戯を。(例によってcygwin+gcc) htmlでは、” (ダブルクォート)が多用されているので、cgiプログラムでは、文字列として定義するときにエスケープする必要があり面倒です。<h1 id=”title”>hello</h1> は、”<h1 id=\”title\”>hello</h1>” として定義しなければなりません。このおかげで、Starbug1のソースは大変なことになってます。普通ならテンプレートエンジン書け!ってことになるんでしょうが、Starbug1の性質上余分なことはしたくないので、現在htmlをエスケープしながら直書きしてます。 プリプロセッサで処理する方式で、エスケープせずにhtmlを記述できるようになると非常に嬉しいので、# を使ってヒアドキュメント風なものを試してみました。最初試したのは、↓のような感じ
gcc(Gnu C Compiler)の拡張文法 [警告!] C/C++言語初心者はこのページを読まないでください。 このページではgcc独自のC/C++拡張文法について解説します。 これらの拡張文法が可能にする機構は確かに便利なのですが、 もちろんANSI規格に従っていないので、一般的には使うべきではありません。 C/C++言語文法を学び始めている初心者はこれらgcc拡張文法を 知るべきではありません。C/C++言語を正しく理解する上で大きな 支障となります。 C/C++言語を十分に熟知した者は、gccがこのようなこともすることを 「雑談」として知っておくと楽しいかもしれません。もちろん 実戦に使うべきではありませんが。しかし初心者が偶然に、これらの 機能を使ってうまくいく場合がありますので、そのような初心者を 見つけたら、それが標準規格ではないことを注意してください。 配列変数をコピー
main() の前に関数を呼ぶ C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。 GCC では main() の前に呼ばれる関数を __attribute__((constructor)) という拡張機能を使って定義できます。たとえば、次のプログラムでは main() の前に foo() が呼び出されます。 #include <stdio.h> __attribute__((constructor)) void foo() { printf("hello, before main\n"); } int main (int argc, char **argv) { printf("hello, world\n"); return 0; } 実行結果は以下の
518 :名前は開発中のものです。:2010/08/29(日) 22:47:44 ID:9rTjBNB+ #include "Hoge.cpp" こんな事できるんだ 519 :名前は開発中のものです。:2010/08/29(日) 23:02:09 ID:m5UOgFEg >>518 単にファイルの中身を挿入してるだけだからね。 #include "hoge.txt" でもおkよ。 CSVとかデータを豪快にいれたこともあったなこんなして、 int aa[] = { #include "hoge.csv" }; 520 :名前は開発中のものです。:2010/08/30(月) 03:50:37 ID:9bcjBgda >>519 言われてみれば確かにできるんだけど なかなか実際にはその発想に至らない・・ 521 :名前は開発中のものです。:2010/08/30(月) 09:57:59 ID:81
実装依存なので注意。今回の話は Linux (glibc) についてです。 pthread_create 第一引数や、pthread_self戻り値で使用される pthread_t 型であるがその値の意味について考えたことは無かった。 pthread_t 型をマニュアルなどを確認すると「スレッドの識別子」と記載されているが、システムコール(gettid)の返す値とは異なり、無意味な値だと考えていた。ところが、前回の調査を行なった結果、あるところのポインタ値であることが分かった。 まず、pthread_t の値(ポインタ値)を確認しみる。値自体は gdb で “info threads” としたときにも出力されます。 (gdb) info threads 2 Thread 0xb7fedb90 (LWP 8398) 0xb7fff424 in __kernel_vsyscall () *
普通のやつらの下を行け: C でバックトレース表示 普通のやつらの下を行けの第2回として、今回は glibc の関数を使って C でバックトレース (スタックトレース) の表示を行ってみます。 バックトレースとは バックトレースとは、大ざっぱに言うと、現在の関数に至るまでの道筋です。たとえば、次の Ruby プログラムを実行すると、 1 / 0 の行で例外が発生して、バックトレースの表示とともにプログラムは異常終了します。 def foo 1 / 0 end def main foo end main この例では main から foo を呼び foo の中の 1 / 0 の部分で例外が発生しています。 % ruby divide-by-zero.rb divide-by-zero.rb:2:in `/': divided by 0 (ZeroDivisionError) from div
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く