トップページtech
1001コメント301KB

C言語なら俺に聞け(入門編)Part 116

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/06/14(金) 20:22:05.73
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 115
http://toro.2ch.net/test/read.cgi/tech/1368444993/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&;andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 164代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/C/C++の宿題片付けます 165代目
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0261 ◆QZaw55cn4c 2013/06/25(火) 21:34:56.45
>>260
こっちからはなにかよくわかっていませんが、持ちネタの「仮定義」tentative defenision のよーな木が

extern は要らない子っ!!!!
0262デフォルトの名無しさん2013/06/25(火) 21:40:53.08
undefしてマクロ再定義し、includeを2度する邪悪なソースを見たことがある
0263 ◆QZaw55cn4c 2013/06/25(火) 21:47:01.53
>>262
じゃあ番兵 #define の識別子をきみょーきてれつにするんだ!
0264デフォルトの名無しさん2013/06/25(火) 21:48:53.53
>>263
いやそれヘッダ開いてコピペされるだけだから…#pragma onceとか使うしかないっしょ
0265デフォルトの名無しさん2013/06/25(火) 22:48:00.10
常駐先の人件費抑制に利用されただけの人生だったな残念w
0266デフォルトの名無しさん2013/06/26(水) 00:14:02.45
>>261
そりゃ業務で分割コンパイルも経験した事のないヤツにはexternは不要だろうな
0267 ◆QZaw55cn4c 2013/06/26(水) 04:07:29.94
>>266
キーワード extern を1回も使わなくても複数の翻訳単位で系を構成することはできます(棒)
extern は要らない子っ
0268デフォルトの名無しさん2013/06/26(水) 10:55:37.73
>>267
関数のプロトタイプはexternなしでもいいし、変数もグローバル変数使わなければいいしな。
0269デフォルトの名無しさん2013/06/26(水) 10:59:18.24
C言語のスレなんだが
0270デフォルトの名無しさん2013/06/26(水) 11:03:22.03
Cだとextern不可避のことってあるんだっけ。
0271デフォルトの名無しさん2013/06/26(水) 11:07:49.59
http://www.kouno.jp/home/c_faq/c1.html#11

1.11:
関数宣言についたexternは何を意味するのか。

A:
こういう書き方をすることで、関数の定義がたぶん別のソースファイ ルにあるということを、ほのめかすことができる。しかし以下の2つ に違いはない。

extern int f();

int f();

References:
ANSI Sec. 3.1.2.2, Sec. 3.5.1; ISO Sec. 6.1.2.2, Sec. 6.5.1; Rationale Sec. 3.1.2.2; H&S Secs. 4.3,4.3.1 pp. 75- 6.
0272デフォルトの名無しさん2013/06/26(水) 11:16:18.07
>>268>>270
オブジェクト指向ではないC言語はどうしても大域変数が欠かせない場面が多い

>>267は実務をしらないニートの発言
0273デフォルトの名無しさん2013/06/26(水) 11:30:33.05
>>272
手元にあったgitのソースにgrepかけてみたら、変数のexternはerrnoの一個しかなかったわ。
普通に組んでたらいらないんじゃないの。
02742732013/06/26(水) 11:41:12.99
よくみたらけっこうあったわ > 変数のextern
ごめん。
0275デフォルトの名無しさん2013/06/26(水) 11:44:50.09
オブジェクト指向でないから、大域変数を完全に使わないとすれば、構造体に
変数を持たせてそのポインタを持って回る事になるが、このプログラミングスタイル
は管理が大変な上にエラーの原因になりやすい

externを使った方が遥かに楽な場面が多い
0276デフォルトの名無しさん2013/06/26(水) 12:14:07.85
大域変数宣言する際に、externをつけなくてもいいという話なんじゃないの?
0277 ◆QZaw55cn4c 2013/06/26(水) 12:31:20.85
>>268
グローバル変数を使うときでも制約はありますが extern キーワードを使わなくともリンクできます(棒)
0278 ◆QZaw55cn4c 2013/06/26(水) 12:32:53.04
>>272
>>277
キーワードを先に示しているのに‥‥
趣味でも英語読むのに実務で英語読まないとかありえるのですか‥‥
0279デフォルトの名無しさん2013/06/26(水) 12:33:09.81
持ちネタはもういいよ
0280デフォルトの名無しさん2013/06/26(水) 12:40:42.95
こういう表記がわかりません

#define H8_3069F_SCI_SMR_CKS_PER1 ( 0<<0 )
#define H8_3069F_SCI_SMR_CKS_PER4 ( 1<<0 )
#define H8_3069F_SCI_SMR_CKS_PER16 ( 2<<0 )
#define H8_3069F_SCI_SMR_CKS_PER32 ( 3<<0 )
0281デフォルトの名無しさん2013/06/26(水) 12:42:52.63
>>276
どれか一つのファイルにはexternは必要だぞ
全部書いてなかったらリンクできない
0282デフォルトの名無しさん2013/06/26(水) 12:44:39.50
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5.4.html

こういうのは古いけど今でも立派に通用するテクニックだ
0283デフォルトの名無しさん2013/06/26(水) 12:50:46.95
>>277
どうやってリンクするの?
0284デフォルトの名無しさん2013/06/26(水) 12:55:36.54
狂人に構うなよ
時間の無駄だぞ
0285デフォルトの名無しさん2013/06/26(水) 13:03:32.22
「externは必要」というのは間違い。省略した場合はexternが付いているのと同じだから。
「externは不要」というのは間違い。明示的に書くことで外部宣言されていることが分りやすくなるから。
「externは書いた方が親切」これが正解。
0286デフォルトの名無しさん2013/06/26(水) 13:03:35.29
初歩的なミスだけどこういうのにはまる事もあるからなあ

--- a.c

extern int *a;

--- b.c

int a[100];

なぜ動かないか最初は理解出来なかった
0287デフォルトの名無しさん2013/06/26(水) 13:05:02.34
>>285
それ関数の話?
0288デフォルトの名無しさん2013/06/26(水) 13:06:27.26
>>285
ちょっと違うなあ

http://blog.bitmeister.jp/?p=614

>externのついた大域変数は必ずいずれかのモジュールに実体がないとダメで、
>externのつかない大域変数は基本的にexternありと同じだが、いずれのモジュールにも
>実体がなければリンカが実体を作る、という感じになるでしょうか。

リンカに任せるのかよ
バグの温床になりそうだな
0289デフォルトの名無しさん2013/06/26(水) 13:10:52.54
ついでにコメ欄

>fs Says:
>6月 11th, 2011 at 11:00 PM
>このような言語仕様になった(externの省略が許されるよう緩和された)理由は、
>もともとUNIX他のオペレーティングシステムのリンカーがFortran言語を前提に
>作られている現状を追認するためなのではないかと思います。Fortranは
>上記の「初期値式を持つ定義」は許されない代わりに、extern宣言は不要ですから。

「extern不要!」と言ってるやつはロートルじゃねーの
俺はexternを省略するな、と教わった口だからな
0290デフォルトの名無しさん2013/06/26(水) 13:35:54.07
C言語自体が化石言語……
0291デフォルトの名無しさん2013/06/26(水) 13:39:45.88
化石言語が未だに大学で教えられている件について
02922852013/06/26(水) 14:08:30.53
関数の話かと勘違いしちゃった…
02932852013/06/26(水) 14:33:07.27
仮定義っていうのか。勉強になったわ。

仮定義
初期化子を指定しない定義を仮定義という。同じ変数の仮定義は、1つの翻訳単位に複数存在しても構わない。
定義と同様、実体は確保される。仮定義が一つの翻訳単位に複数存在した場合、コンパイラはそれらを1つにまとめ、
0の初期化子を持ったものとして定義する。ただし、全翻訳単位において既に定義が存在すれば、extern宣言された
ものとして振る舞う。この挙動は紛らわしい為、特に必要でない限り仮定義を用いるのは避けた方が無難である。

int n;

尚、同じ仮定義が複数の翻訳単位に存在する場合の、リンク時の動作は規格化されていない。
故に、この場合の動作は未定義である。gccではこの場合、コンパイラが解決している模様。
また、定義と仮定義が同時に存在する場合もコンパイラが解決している模様(言うまでもなく、
定義は2つ以上存在してはならない)。

http://d.hatena.ne.jp/XuHuang/20070624/1182669569
0294デフォルトの名無しさん2013/06/26(水) 14:34:11.67
つまりQZは

>この挙動は紛らわしい為、特に必要でない限り仮定義を用いるのは避けた方が無難である。

これを正当化してるわけか
糞だな
0295デフォルトの名無しさん2013/06/26(水) 14:56:31.49
>>293
externなしでも勝手に変数をまとめちゃうような変態機能とかあんのか。
0296デフォルトの名無しさん2013/06/26(水) 15:13:13.96
>>295
老害しか使わない馬鹿機能だから知らなくていい
0297デフォルトの名無しさん2013/06/26(水) 15:26:03.63
プロなら知ってないとまずい。
0298デフォルトの名無しさん2013/06/26(水) 15:39:46.15
プロ?ニートのどこがプロなの?
0299デフォルトの名無しさん2013/06/26(水) 15:53:25.72
うるさいゴミ
0300デフォルトの名無しさん2013/06/26(水) 16:10:39.97
とニートが発狂しております
0301デフォルトの名無しさん2013/06/26(水) 19:06:50.74
客先常駐で偉そうな客先社員に見下されて何の経験にもならない雑用を押し付けられて精神病むのがオチw
30代で常駐先がなくなって未経験の異業種で人生やり直すのがオチw
常駐先企業の人件費抑制に利用されただけの人生だったな残念w

システムエンジニアになろう〜新入社員研修編〜
ttp://www.nicovideo.jp/watch/sm4010880
0302デフォルトの名無しさん2013/06/26(水) 19:12:44.20
無知を正当化してどうする
知ってることと実装で使っちゃうことはまったく別の話だろ
0303デフォルトの名無しさん2013/06/26(水) 19:31:39.63
ここを読んで、ひとつ知恵がついて、客先で赤っ恥をかかないで済む
それだけでも良いんじゃない?
0304デフォルトの名無しさん2013/06/26(水) 19:54:14.25
>>302
もう無知ではない
だが使うのは奨励されない
0305デフォルトの名無しさん2013/06/26(水) 20:43:40.94
externとか不要だろ
全部引数で渡せよ
0306デフォルトの名無しさん2013/06/26(水) 20:47:37.52
>>305
それでももちろんいいが、OOP言語じゃないと見通しが著しく悪くなるし、
アクセス制御も出来ないっしょ?

C言語では必要悪
0307デフォルトの名無しさん2013/06/26(水) 20:55:28.54
定数を指すマクロも極力引数渡しするのかな…

コンパイル時ではなく起動時に確定した後、変わることはない値とか
準マクロ的に使いたくなる
0308デフォルトの名無しさん2013/06/26(水) 20:59:27.49
普通に構造体でなんとかなる
0309デフォルトの名無しさん2013/06/26(水) 21:00:07.61
組み込みやドライバなら許す
0310デフォルトの名無しさん2013/06/26(水) 21:11:49.11
>>293
規格書にもポータブルでないと明記されている。
企画書の何処に書かれているか分からないゴミクズが炎上学習企んでるだけ WWWW
0311デフォルトの名無しさん2013/06/26(水) 21:21:12.93
>>308
だからアクセス制御ないからバグが入るって

>>310
やっぱりか
クズはクズだなあ
0312デフォルトの名無しさん2013/06/26(水) 21:22:46.79
>>311
アクセス制御とか言い出したら
グローバル変数なんて完全に開けっぴろげだろw

それに構造体も隠蔽可能だぞ
ヘッダには宣言だけ書いて
全部関数を通じて操作させればいいだけ
生成は動的になるけど
0313デフォルトの名無しさん2013/06/26(水) 21:25:38.32
FILEの中身知ってる奴いんのか
Cで隠蔽とか普通に可能
0314 ◆QZaw55cn4c 2013/06/26(水) 21:45:11.87
>>281
それができるのです(棒)
0315 ◆QZaw55cn4c 2013/06/26(水) 21:46:11.61
>>283
初期化せずに宣言だけする形をとれば extern なんかつける必要はありません(棒)
0316 ◆QZaw55cn4c 2013/06/26(水) 21:48:33.57
>>289
MASM5->MASM6 では EXTERNDEF なるディレクティブが新設されたくらい当たり前に新しい考え方

>俺はexternを省略するな、と教わった口だからな
本質を理解しないと新しいことに対応できなくなりますよね
0317 ◆QZaw55cn4c 2013/06/26(水) 21:49:18.00
>>290-291
化石言語とやらでいまだにOSが書かれている件について
0318 ◆QZaw55cn4c 2013/06/26(水) 21:49:39.68
>>295
リンカがね
0319デフォルトの名無しさん2013/06/26(水) 21:50:43.65
>>310
>規格書にもポータブルでないと明記されている。
でそれはどこ?具体的に引用できないようでは馬鹿が喚いているのとかわらないよね
0320デフォルトの名無しさん2013/06/26(水) 21:51:19.31
おっあぼーんが連続してるんだが
0321 ◆QZaw55cn4c 2013/06/26(水) 22:05:58.49
>>293
>gccではこの場合、コンパイラが解決している模様。
コンパイラがリンクするわけがない。リンカがリンクするんだ。それを書いた奴は誰?URL をさらしてくれないか?
表からみえる gcc はコンパイラドライバであってコンパイラではない

>定義と仮定義が同時に存在する場合もコンパイラが解決している模様(言うまでもなく、定義は2つ以上存在してはならない)。
定義という言葉自体が曖昧。この問題を正確に記述するのであれば、「初期化を伴う定義」と「宣言」または「仮定義」の二つのみを使うべき
初期化を伴う定義はリンクするオブジェクトのすべてにおいて二箇所以上に存在してはならない、それだけの話だ
0322 ◆QZaw55cn4c 2013/06/26(水) 22:08:41.51
>>282
残念ながらCならばそんなことをする必要はないMASM6だって必要なかったくらいだからねその著者もあやしいものだね
0323デフォルトの名無しさん2013/06/26(水) 22:09:56.74
オブジェクトファイルを作成する時に
inline 関数などリンク時に同一にまとめられる識別子は
「複数定義を同一にまとめる」という属性を付けるけど
それの話か?
0324 ◆QZaw55cn4c 2013/06/26(水) 22:10:33.44
>>310
リンカやオブジェクトファイルの仕様がCの言語仕様書に明記されるのか?かなり疑問だ
0325 ◆QZaw55cn4c 2013/06/26(水) 22:12:08.85
>>279
まだまだこのネタいけるね
0326デフォルトの名無しさん2013/06/26(水) 22:18:23.06
突然回答者のレベル下がったな
0327デフォルトの名無しさん2013/06/26(水) 22:24:02.59
要するに環境依存って事だろ
スレ違いだ
0328デフォルトの名無しさん2013/06/26(水) 22:26:22.51
>>327
環境依存というわりには「適用できない環境」なるものを具体的に列挙できない件について
0329デフォルトの名無しさん2013/06/26(水) 22:33:06.23
列挙して欲しいならそう聞けよ初心者さんよ
態度でかくね?
0330デフォルトの名無しさん2013/06/26(水) 22:39:05.27
関数と同様にリンカが未定義エラーにするのが良い感じするんだけどね
0331デフォルトの名無しさん2013/06/26(水) 22:44:24.80
日本のIT企業は人材派遣会社でしかない
昔からある日本の大企業の社員の雇用を守る為にIT技術者が人件費抑制のために使い捨てにされていってるだけw
0332デフォルトの名無しさん2013/06/26(水) 23:49:57.82
>>324
お前が知らないだけ。WWWW
アマゾンギフト10万円で教えてやるよ。
0333デフォルトの名無しさん2013/06/27(木) 03:14:35.49
>>329
列挙してくださいお願いいたします
0334デフォルトの名無しさん2013/06/27(木) 09:37:43.79
>>315
もう他の人が書いてるからあんたはいいよ。
0335デフォルトの名無しさん2013/06/27(木) 10:54:04.07
そう?今でもここまで盛況になるのならネタとして活きがいいと思うけど
また来年くらいにやってみよー
0336デフォルトの名無しさん2013/06/27(木) 12:12:21.23
バカな奴って物事の優先順位をちゃんとつけられないから、
くだらないところに拘って時間を無駄にするよな
0337デフォルトの名無しさん2013/06/27(木) 13:08:41.59
>>335 >>336
こういう話の流れがわかない書き込みってなんなんだろう。
いろいろ考えて自分の頭の中ではなんかストーリーがあるんだろうけど、エスパーじゃないからわからない。
0338デフォルトの名無しさん2013/06/27(木) 13:10:22.92
>>337
ごくろう
話は終わったんだよ
0339デフォルトの名無しさん2013/06/27(木) 13:11:15.13
エスパーだけど分かんないよ
0340デフォルトの名無しさん2013/06/27(木) 13:17:22.61
>>335 は上で盛り上がったexternのネタを来年にまたここで振って盛り上がるとうれしいって暇なレス乞食だろ。
>>336 はエスパーだけどわからん。
0341エスパー2013/06/27(木) 13:45:55.47
ガッ
0342デフォルトの名無しさん2013/06/27(木) 21:55:43.73
extern = public
static = private
0343デフォルトの名無しさん2013/06/27(木) 22:25:42.00
extern int array[10000];
こういう定義がふくまれるヘッダーファイル

arrayを使っている(定義している)モジュールをリンクしなければarrayの領域は確保されないが、
int array[10000];
では、使う使わないに関わらず領域が確保されてしまう。

要約するとQzはうんこ
0344デフォルトの名無しさん2013/06/27(木) 22:27:38.84
署名わすれたわ WWWW

要約するとQzはうんこ WWWW
0345デフォルトの名無しさん2013/06/27(木) 22:29:37.45
これはでかいつりばりだ
0346デフォルトの名無しさん2013/06/27(木) 23:35:43.97
はーいQzちゃん
いつものお客さんがご指名よ
0347デフォルトの名無しさん2013/06/28(金) 19:11:21.34
>>342
externって実体じゃないから、違うんじゃね
0348デフォルトの名無しさん2013/06/29(土) 00:08:36.30
>>345
全然かからないのは、やはりでかいからか?
0349デフォルトの名無しさん2013/06/29(土) 09:56:01.76
ポインタの指す領域が解放(free)されているかどうかを調べる方法ってありますか?
今回は具体的にはsqlite3_closeを実行するとsqlite3_freeが
呼ばれているのかどうかを知りたいだけなのでドキュメントを見れば解決しそうなのですが、
普遍的にこういういのをプログラム上から調べる方法があったら教えてください。
0350デフォルトの名無しさん2013/06/29(土) 10:00:09.50
>>349
> 普遍的に

ない。
以上。
0351デフォルトの名無しさん2013/06/29(土) 10:11:15.42
>>349
ない
必要なら自分でアロケータを書くしかない
0352デフォルトの名無しさん2013/06/29(土) 11:54:53.53
ポインタにNULLを入れて何回でもfreeすればいいだけ
0353デフォルトの名無しさん2013/06/29(土) 12:00:32.81
ポインタの指す領域が解放(free)されているかどうかを調べる方法ってありますか?
今回は具体的にはsqlite3_closeを実行するとsqlite3_freeが
呼ばれているのかどうかを知りたいだけなのでドキュメントを見れば解決しそうなのですが、
普遍的にこういういのをプログラム上から調べる方法があったら教えてください。
0354デフォルトの名無しさん2013/06/29(土) 12:09:23.93
10万回くらい試行して、メモリリークするか見る。
0355デフォルトの名無しさん2013/06/29(土) 12:12:49.27
#define FREE(p) { if(p!=NULL) free(p); p = NULL; }
freeを全部上に置き換えてpがNULLだったらfree済みだし何回でもfreeすればいい
0356デフォルトの名無しさん2013/06/29(土) 12:50:15.90
>>355
それはFREEされたかどうか、NULLが入ってるかどうかを調べるということであって、
freeされたかどうかを知る手段ではない。
質問の意図が分からないゴミはカキコするな。
0357デフォルトの名無しさん2013/06/29(土) 12:57:48.43
必殺のxalloc()(笑)でも使うか?
0358デフォルトの名無しさん2013/06/29(土) 13:22:22.73
freeした領域に、書き込めばいいんじゃね
そのうち、例外が発生してくれる
0359デフォルトの名無しさん2013/06/29(土) 13:24:00.87
実装依存
メモリプールだったらアウト
0360デフォルトの名無しさん2013/06/29(土) 13:42:36.64
通常の free の話だけじゃなくて
sqlite3_close 内で sqlite3_free が呼ばれるかまで含んだ話だから
free をマクロで置き換えるとかじゃどうしようもない
sqlite3_close の実装が変更できる状況であればソースがあるわけで、
sqlite3_free を呼んでるかはソース読めば分かるわけだし、
最悪分からなくてもログ仕込めばいい

実装を変更できない状況でどうするかとなると、
free や sqlite3_free などの後に実行するとエラーになる処理や
free や sqlite3_free などによるメモリ上の何らかの変化の存在が分かれば、それで判別できる

あとはリバースエンジニアリング、
あるいはライブラリファイル内の free や sqlite3_free などのコードを
ログ出すだけの処理に改竄するとか
■ このスレッドは過去ログ倉庫に格納されています