C言語なら俺に聞け 147

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/08/16(木) 23:36:02.22ID:fOCSKLtw
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 146
https://mevius.5ch.net/test/read.cgi/tech/1525031257/
2018/08/25(土) 19:28:15.91ID:sh4ZcDkv
>>496
ああ、ごめん。
一生懸命ネタ振ってたのね。でもネタフリにしてはあんまり面白くはないかな。
ただ俺はそんな一生懸命なお前嫌いじゃない(笑)
2018/08/26(日) 02:50:43.41ID:5Jlr+RDR
一日でこの板に少なくとも 23 回「低学歴知恵遅れ」って書いてるね。
どれだけ拗らせてるの?
2018/08/26(日) 03:24:56.95ID:BwlGzYMc
23/35=65.7%
うぷぷぷ
2018/08/26(日) 09:18:36.35ID:aDjvXB/e
職場で言われていることをここで
2018/08/26(日) 11:23:23.80ID:0Dyu3Dip
いやぁ、今どき職場で「低学歴知恵遅れ」なんて言ってくる上司がいたら
ネット掲示板で同じセリフを繰り返すより、録音して訴えるだろ。

それにしても、まるで署名のように必ず投稿文に盛り込むから、
何か隠された意図があるのでは、と深読みしてしまうのも事実。
単にクセになってて本人には意味の薄い間投詞になってるのかも知れんけど。


…読み取れないとガッカリなので一応書いておくけど、
「いくら匿名の電子掲示板でもそういう言葉遣いは良くないよ」と
たしなめている(忠告している、の方が受け入れやすいかな)つもり。
2018/08/26(日) 11:27:57.33ID:aDjvXB/e
それが当たっていると、訴えるのも恥ずかしいような
2018/08/26(日) 12:44:59.10ID:d3emHXQQ
>>501
純粋かよ
504デフォルトの名無しさん
垢版 |
2018/08/26(日) 14:53:35.15ID:hANAm2gW
低学歴底辺のクソニート、そして底辺ドカタなのは
図星なんでしょ

人間をホントのこといわれると
必死になる
505デフォルトの名無しさん
垢版 |
2018/08/26(日) 14:56:43.12ID:hANAm2gW
残念なことに
低学歴かどうかとか
知恵遅れかどうかとか
クソニートかどうか
底辺ドカタかどうか
レスからすぐに分かってしまう

まともに人間がみればすぐに分かる
キミラはなまとなに人間未満のゴミクズなワケ

その自覚すらない
だからまともな人間にすらなれないわけ

わかった?
2018/08/26(日) 16:10:55.42ID:dQLVYknK
必死なのはお前じゃん
2018/08/26(日) 16:12:25.06ID:LX/My+gD
半コテって一番タチ悪いな
コテハンつけろよNGにするから
2018/08/26(日) 16:25:44.03ID:lAySnCDy
本当は夏休み中の中高生じゃないのか?
何だか妙に精神年齢が幼く思える
2018/08/26(日) 16:27:03.18ID:aDjvXB/e
名前は半角カタカナで頼む
510デフォルトの名無しさん
垢版 |
2018/08/26(日) 16:29:48.93ID:hANAm2gW
図星でしっかり反応してるしな

やっぱりなこのスレは
駆除が必要な典型的な低学歴知恵遅れの
クソニートとか底辺ドカタしかいないわ
2018/08/26(日) 17:09:28.74ID:BwlGzYMc
小馬鹿にした発言が頭悪そうな最高に痛いやつ
2018/08/26(日) 18:07:37.48ID:ujNq2aVI
>>508
確かに夏休み始まった辺りから見かけるようになった気がする
2018/08/27(月) 06:20:27.93ID:sdfxNc/O
>>499
このスレだけなら 35 だが、この板全体の数なんだ。
必死チェッカーもどきを見たら堂々の 2 位で笑った。
いや、彼の御高説をもっと見たかったんだ。
ちなみに「知恵遅れ」はその 23 とは別に単独で 16 回出てきたよ。
2018/08/27(月) 08:24:49.48ID:4HBkx10J
自称、俺最強君()は、昔からしばしば見かけるけど。
小学生にも苦笑されそうなレスばかりで、相手をする気にならないんだよね。

http://hissi.org/read.php/tech/20180825/MHI1aDYvbEw.html
http://hissi.org/read.php/tech/20180826/aEFOQW0yZ1c.html

勝手に勝利宣言して逃亡するまで放置しておくのが吉。
2018/08/27(月) 08:45:35.65ID:4ArgrBnx
半角さんはこの板の唯一の良心
この板は腐ってる
2018/08/27(月) 11:56:02.39ID:woJf6ZC9
>>413
if (条件) {
 …
 …
 ここで(ブロックから)抜けたい -(1)
 … -(2)
} else { … }

こういうこと? (1) はさらに if で条件付で分岐しないと意味がないけど…
※ (1)で分岐しないかぎり (2) 以降が無意味のコードになる

if の外側を do { } while(0) で外を囲って break; したら?
2018/08/27(月) 12:18:18.46ID:yF4/ft+h
>>515
これだな
2018/08/27(月) 12:18:56.82ID:yF4/ft+h
おまえらはすぐにどうでもいいことに流される
519デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:34:41.00ID:ywsjsNTA
>>516
それだったら2を実行するための何らかの条件がある筈なのでそのためのifブロックの中に2を入れればよい。
そつではなく無条件に2を実行したくないならばソースから削除するかコメントにでもすればよい。
520デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:36:44.69ID:ywsjsNTA
すまん。スマホでフリック入力しててタイプミスした。
2018/08/27(月) 12:42:48.65ID:woJf6ZC9
>>519 意図は伝わったぜー
確かにw

if (条件1) {
 …
 if (条件2) { … -(1) } else { … -(2) }
2018/08/27(月) 12:48:15.12ID:nj2QXsVo
>>519
そりゃ方法なんていくらでもあるよ
そういう方法をとりたくないってことだろ
理由はしらんが

たとえば(-2)が大きくてインデントを変えたくないとか
2018/08/27(月) 12:50:40.87ID:vY3QDx2y
だから何でdo while(0)なんて変態コードに固執するんだよ
2018/08/27(月) 12:51:47.69ID:YYT/vI56
>>522
>>521の方法を思い付かなかった、or 妥当な書き方であると知らない、だけだは?
2018/08/27(月) 12:54:54.13ID:woJf6ZC9
元質問者に聞くしかない 「goto は使いたくない」の条件で
526デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:59:44.74ID:ywsjsNTA
ブロックというものを中に入ったら出られないものと勘違いしているとか。
最初にforやwhileを覚えちゃって勘違いに繋がったとか。
2018/08/27(月) 13:22:18.19ID:vY3QDx2y
何人たりともforより先に関数のブロックを憶えるのにね
関数のブロックだけが何か特別なものと思い込んでるケースが多い
2018/08/27(月) 13:25:30.84ID:Q5lEKL35
goto 便利だけどなぁ。
break するがためのフラグ作って何ブロックも break するとか goto を避けるがためのいびつな if を連続させるとかよりよほど可読性が高い。
もちろん意味を的確に表したフラグやifの構造にできるに越したことはないけどさ。
2018/08/27(月) 13:28:07.17ID:aXwyVMA/
>>523
あえて固執して解決方法を編み出しておくと
ひょんなときに役立つことがあるしな
準備なんてのは9割無駄で当たり前だよね
2018/08/27(月) 13:31:18.13ID:vY3QDx2y
ジャクソン法やワーニエ法みたいに
データ構造とプログラム構造を一致させる構造化プログラミング()では
データが損傷していた場合にはプログラム構造を一致させることができない
よって構造化定理を諦めたアプローチをせざるを得ない
こういうのがgotoやlongjmpの出番
2018/08/27(月) 13:32:12.14ID:vY3QDx2y
>>529
その説明じゃ変態行為に固執する理由が説明できてないだろ
ええ加減にせんか、この変態!
532デフォルトの名無しさん
垢版 |
2018/08/27(月) 13:35:23.06ID:ywsjsNTA
ま、Cの場合は適切にgoto使った方が良いだろうな。後から作られた言語では break でラベル指定できるだの例外処理できるだのしてるから使わなくて済むようになってるわけで、それのないCはそれの代わりにgoto利用しちゃった方が分かりやすく書ける。
2018/08/27(月) 13:41:42.47ID:vY3QDx2y
いやCのgotoは制限がキツすぎて
いざという時には役立たず
だからlongjmpがある
2018/08/27(月) 14:22:47.97ID:Q5lEKL35
そんな制限キツかったっけ?
longjump の方がキツいでしょ
2018/08/27(月) 14:23:38.81ID:vY3QDx2y
何がキツいって関数から出らんない
2018/08/27(月) 14:34:05.72ID:J1p6Vf0T
setjump/longjumpは簡易タスクディスパッチャーをC言語だけで実現するためだけにあるのかと思ってたよ。
それ以外の用途はあんまり思い浮かばないなぁ。
2018/08/27(月) 14:40:44.92ID:TsaU1TVW
自分で対処不能なエラーが起きたときに、初期化してやり直す時に使ったな
だもんで通常の処理の流れで使うものだとは思わなかった
2018/08/27(月) 16:09:02.07ID:vY3QDx2y
ディスパッチャとしてはダメダメじゃん
jmp_buf jb;

void sig(int n)
{
longjmp(jb, 1);
}

int main(void)
{
signal(SIGINT, sig);
if (setjmp(jb) == 0) for (;;) ;
else puts("ok");
return 0;
}
俺んとこではokが出ない
おまいらんとこではどんな結果になる?
2018/08/27(月) 16:16:45.47ID:J1p6Vf0T
確かsignalとlongjmpは相性悪かったような?
よく覚えてないけど。
540デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:27:43.33ID:VuJs8kRo
>>538
こちらは Linux (CentOS7)だが、出たよ。
541デフォルトの名無しさん
垢版 |
2018/08/27(月) 16:29:13.02ID:VuJs8kRo
>>539
sigsetjmp(), siglongjmp() ってのがあるので、そっち使った方が良さそうではあるな。
2018/08/27(月) 16:33:51.80ID:J1p6Vf0T
Linuxとかならpthreadがあるのでわざわざ自分でディスパッチャ作ることはないと思うけど、組み込み用に簡易的に作ることはあるかもね。

俺は組み込みならprotothreadsのほうがシンプルで好き。
2018/08/27(月) 17:20:53.65ID:cJbIVPPr
#include <signal.h>
void (*signal(int signum, void (*sighandler)(int signum)))(int signum);

この宣言が読めない
2018/08/27(月) 17:30:35.88ID:vY3QDx2y
signal 関数名
signum 第1仮引数名
sighandler 第2仮引数名

sighandler ポインタ
*sighandler 関数
signum 第1仮引数名

signalの返却値はsighandlerと同じ型
2018/08/27(月) 18:31:36.73ID:C1HpzEi0
>>524
思い浮かばないってのがなかなか考えられない
ていうか、
for/while/do while 以外もbreakで抜けられたら良いと思ったことが私もある


>>525
なぜgotoは使いたく無い?
という質問の答えも聞いておかないと
コーディング規約なのか宗教なのか
gotoの使い方を知らないだけなのか
2018/08/27(月) 18:49:30.60ID:C1HpzEi0
>>536
OSのタスク切り替え処理
ブートローダーからアプリケーションへのジャンプ
リセット
例外処理
2018/08/27(月) 19:22:28.99ID:FN2jn8ES
>>546
全て別の方法で実現しちゃうので、俺的にはlongjmpの必要性を感じないかな?
2018/08/27(月) 19:30:11.24ID:m5aHtIH2
>>530
高度すぎてなに言ってるかわからん
2018/08/27(月) 19:46:09.70ID:nZJhjhuf
まあデータの損傷をいきなりデータ構造そのものの破綻に結びつけるのは些か強引な論理展開ではあるな
2018/08/27(月) 19:55:16.65ID:C1HpzEi0
>>547
関数ポインタ
アセンブラ
スタック書き換え

このどれか?
2018/08/27(月) 20:08:36.09ID:FN2jn8ES
>>550
こんな感じ。

OSのタスク切り替え処理
→普通にOSの機能を使う、カーネルなしで簡易ディスパッチャ実装はpthread

ブートローダーからアプリケーションへのジャンプ
→アドレス固定ならアドレスを関数ポインタにキャストしてジャンプ、またはインラインアセンブラ

リセット
→周辺機能やbssやdataセクションも初期化したいのでWDT等のCPUリセット機能を使う

例外処理
→密結合を避けるためオーソドックスに返り値で判定、最後にgoto使うかも?

そういや例外処理longjmpで思い出したけど、一昔以上前のCマガジンにマクロでC++と同じようなtry〜catch構文実装方法の記事があったけど、確かにそのマクロ内ではsetjmp/longjmp使ってたわ。
マクロでカプセル化してれば例外処理で使うかも。
2018/08/27(月) 20:17:29.99ID:C1HpzEi0
カーネルなしでpthreadの意味がわからん
2018/08/27(月) 20:21:53.00ID:FN2jn8ES
>>552
あ、まちがえた。
pthreadじゃなくてprotothreadsね。
2018/08/28(火) 15:16:05.31ID:wM2MhSxp
http://techtipshoge.blogspot.com/2011/02/blog-post.html
このサイトで、書いてることは正しいと思うしし、実際こうなるんだけど、俺の頭悪いせいでわからない。

駄目な例のsetStr(a)の a は、 &a[0] という”アドレス”を渡してる訳ではないんでしょうか?
なんで駄目な例だと上手くいかないのかという理屈がわからない・・・
2018/08/28(火) 15:16:57.00ID:wM2MhSxp
あ、レスして気づいたけどcoutがあるってことはc++なのかな?
まあこれはprintfってことにしといてくださいw 重複質問になりそうなのでこちらで処理したい。
2018/08/28(火) 15:27:14.25ID:cEEOiaf2
newもC++のキーワードなんだけど。。

関数に実引数のポインタを渡すとその値が、対応する仮引数に代入(コピー)され、以後、仮引数は変数のように使える。
仮引数の値を変えてもコピーが書き換えられるだけで元の実引数の値には影響しない。
書き換えられるようにするには、書き換えたい場所のアドレスを渡して、*演算子か、[]演算子を使わないといけない。
2018/08/28(火) 15:27:46.08ID:10z9ufr/
駄目な例のa = new char [8];はmainのaの複製への代入なのでmainのaはNULLのまま
良い例の*a = new char [8];はmainのaそのものへの代入なので期待した結果が得られる
2018/08/28(火) 15:37:02.95ID:cEEOiaf2
関数呼び出しのとき、実引数がどこにコピーされるかというと、「スタック」という積み上げ式のメモリーブロックか、一時的なCPUレジスタが使われる。
インラインではない関数呼び出しにおいては、関数の戻り先のアドレスと、仮引数のデータがスタックに積み上げられる。
積み上げ式だから、自分自身の関数を呼び出しても動作する。これを「再帰呼び出し」という。
2018/08/28(火) 15:39:32.69ID:cEEOiaf2
スタックの積み上げには限度がある。限度を超えると、スタックサイズが拡張されたり、異常終了する。
スタックの積み上げが限度を超えて異常な状態になることを「スタックオーバーフロー」という。
2018/08/28(火) 15:52:37.71ID:wM2MhSxp
すません。私の質問が曖昧だったので追加で

void setStr(int *a) {

a[0] = 10;

}

int main() {

int a[10];


setStr(&a[0]);
     cout << a[0] << endl;

return 0;
}

例えば、この場合は、setStr(&a[0])として、その後、関数内でa[0]=10;と値を代入すればちゃんと 10 が出力されます。
前のHPの失敗例も同じくsetStr(a)としてアドレスを渡し、受け取りはポインタ変数なのに値は変わらない。
単に数値か文字列かの違いなんでしょうか?
2018/08/28(火) 16:00:50.42ID:Gzofmim2
とりあえず一度、配列とポインタに対する余計な先入観を捨てて素直に元サイトを読み込めば理解できると思うよ
一つの考え方に囚われ過ぎてると思う
2018/08/28(火) 16:05:47.55ID:10z9ufr/
void setStr(char **a) これを
void setStr(int *a) こう読み替え

char *a = NULL; setStr(&a); これを
int a = 0; setStr(&a); こう読み替えてみそ

つまり char* → int と読み替えるんだ
ポインタ変数とアドレスは違うという話は
整数変数と整数は違うという話と同じだ
2018/08/28(火) 16:17:43.85ID:LgBUyhOe
まあスタック使えとは規格に書いてないんだけどね
2018/08/28(火) 16:35:30.28ID:wM2MhSxp
ああ分かった!
俺は自分で勝手に「char型のポインタ=文字列だ」と思い込んでて、そのせいで混乱してただけでした。
思い込み怖い・・・

void setStr(char *a) {
a[0]='a';
}

int main() {
char a[] = "test";

setStr(a);
cout << a << endl;
return 0;
}

これで「aest」と表示されたからピンときた。確かに失敗例はポインタ変数を渡しているだけだw
ありがとうございました。
2018/08/28(火) 18:19:39.20ID:4ROMapnq
>>563
そりゃそうだよ、世の中にはスタックを持たないマシンもあるからな
2018/08/28(火) 18:33:43.92ID:oY+WdDFv
ハードウェアスタックを持たなくて再帰呼び出し出来ないうんこ環境があるね
2018/08/28(火) 18:38:07.52ID:h1lwFjom
そういうのは自分で値を積み上げるように作るしかないな
2018/08/28(火) 18:45:10.17ID:Gzofmim2
そういえばずいぶん昔に昔ながらのBASIC言語でクイックソートを実装したときに当然サブルーチンの再起呼び出しなど使えないので
自分で似たようなことをやったなあ
というか確か何かのプログラム認定試験の定番の出題テーマだった気がする
当時必死に勉強してたことを思い出した
2018/08/28(火) 18:45:55.20ID:Gzofmim2
再起ってなんだ再帰の誤変換
2018/08/28(火) 18:47:51.41ID:h1lwFjom
再帰 不能
2018/08/28(火) 19:51:12.99ID:zI7irPVs
ぴゅう太なんてレジスタがなかった
2018/08/28(火) 19:56:09.59ID:c8HqOUoV
>>571
そんなアホな…

うわ、ホントだ。汎用レジスタは全て外部RAMにマッピングされてたのね。
2018/08/28(火) 20:04:33.36ID:10z9ufr/
制御記憶を主記憶とシェアするアーキテクチャはそんなに珍しくない
2018/08/28(火) 20:09:30.18ID:c8HqOUoV
普通にR0とかのレジスタ名ついてるんだけど実体は内蔵RAMにマッピングされてるアーキテクチャならよく見るけど、外部RAMってのは初めて見たわ。
今もこういうアーキテクチャのCPUあるのかな?
2018/08/28(火) 20:15:00.09ID:Gymzh0gE
ない
2018/08/28(火) 20:25:08.96ID:10z9ufr/
ぴゅうたって内蔵RAMなんだっけ
2018/08/28(火) 20:28:21.23ID:c8HqOUoV
>>576
wikipediaによると
ROM 内蔵20Kバイト RAM CPU内蔵256バイト/TMS9918用16Kバイト
だそうだ。
2018/08/28(火) 20:53:39.14ID:UQgP5OTn
>>573
制御記憶ってマイクロコードを入れるところなんだが…
主記憶と共用してる奴なんてあったか?
2018/08/28(火) 20:58:39.83ID:10z9ufr/
>>578
必ずしもマイクロ【コード】を入れるところじゃないんだけどね
たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
それやってるときはTestインジケーターが点灯することになってて
2018/08/28(火) 21:38:04.13ID:UQgP5OTn
>>579
> たとえばメインフレームではDIAGNOSE命令で制御記憶を目的外使用なんてのをやってたよ
そんな特殊な例出されてもなぁ w
そりゃ記憶装置だから他の物を入れることはできるよ
だから何? って話だけどな

> それやってるときはTestインジケーターが点灯することになってて
で、主記憶と共用ってどこのアーキテクチャなんだ?
2018/08/28(火) 21:54:20.28ID:d5vKjLdu
>>580
やめたれ w
2018/08/28(火) 22:02:06.14ID:lp3F9A9k
それってセキュリティ上問題にならないのか?
2018/08/28(火) 22:15:00.65ID:d5vKjLdu
いまはやりのcore iのバグみたいな?
2018/08/29(水) 23:07:37.73ID:E6lvAa/y
メルトダウン事件移行もアップデートの度にどんどんコンパイルとか画像縮小なんかの処理が遅くなってる気がする
もう怖くて淫照は買えない
2018/08/30(木) 05:50:33.67ID:zs5ycFHj
ベンチマークしてる?
2018/08/30(木) 08:20:17.62ID:cD6Bz7+B
>>582
そりゃなるよ
命令の動作を書き換えるんだから何でもできちゃう
なのでDiag関連の命令はCE(カスタマーエンジニア)モードでしか使えないとかなってたはず
今時のCPUでもエラッタ対策としてマイクロコードの書換えするけどコード自体は暗号化されてる
この暗号化キーが漏れたらえらいことになると思う
2018/08/30(木) 10:16:53.98ID:zs5ycFHj
X'83は単に特権命令ってだけだぜ
2018/08/30(木) 12:25:33.09ID:cD6Bz7+B
マシンによって違うのか?
M-180HはCEモードでないと動作しなかったが
2018/08/30(木) 12:43:00.44ID:zs5ycFHj
そういうことだね
俺んとこではPWOFFするオウンコードとかできたし
2018/08/30(木) 20:09:52.14ID:cD6Bz7+B
それマイクロ関係ないだろ
2018/08/31(金) 06:31:31.30ID:QWemr4wG
すみません思い切り初心者の質問です。
printf("%s: abc", str);
↑こういう文が abcのみが変わる形で(str変数は変更されません)
沢山登場するプログラムを作っており コピペが面倒だしバグの温床になりそうなので
#defineマクロなどを使って引数にabcを指定すると上記の文がまるごと出力されるようにしたいと思いました。
そこで
#define PR_POS(_pos) printf("%s: _pos", str)
という定義を作ったのですが恐らく引用符の中身は変更されることはないので
#include <stdio.h>
#include <stdlib.h>

#define PR_POS(_pos) printf("%s: _pos\n", str)

int main(void) {
char str[256] = "text";
//printf("%s: abc\n", str);
PR_POS(abc);

exit(EXIT_SUCCESS);
}
というプログラムを作っても実際コンパイルしたものを実行すると
text: _pos
という望んでいない出力が返ってくるだけです
これを
text: abc
という出力にするにはどうすればいいでしょうか……。
2018/08/31(金) 06:43:34.91ID:jQ6ZKbRR
>>591
#define PR_POS(_pos) printf("%s: " #_pos "\n", str)
でいけるはず
詳しくは
プリプロセッサ 文字列化演算子
とかでぐぐれ
2018/08/31(金) 06:44:40.48ID:Df6BGOL7
#define PR_POS(_pos) printf("%s: " #_pos, str)
2018/08/31(金) 06:45:58.45ID:Df6BGOL7
かぶった
しかもまちがった

>>593は無視して
595591
垢版 |
2018/08/31(金) 07:04:03.05ID:QWemr4wG
>>592
うわあああ! ありがとうございます。
正直 検索しても検索しても一向にそれらしき答えが見付からなかったんで
もう方法がないのかなとか思ってました……。
文字列化演算子なるものがあるのですね。用語まで教えていただいてほんとうに感謝しています。

しかもC99でも定められてるっぽい?
(gcc -std=c99 -Wall -Werror -pedanticで警告がなかった)
嬉しいです。これで随分すっきりしたソースコードになりそうです!

>>593さまもありがとうございます。
2018/08/31(金) 07:18:20.44ID:4o8e5lPA
#include <stdio.h>
#define DEBUG(fmt, ...) \
fprintf(stdout, "%s:%d #%s " fmt "\n", \
__FILE__, __LINE__, __func__, ##__VA_ARGS__);

初心者ならこのマクロを覚えておくと良いぞ。誰もが一度は使うはず。
■ このスレッドは過去ログ倉庫に格納されています