C言語なら俺に聞け(入門編)Part 116
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/06/14(金) 20:22:05.73★前スレ
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/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
こっちからはなにかよくわかっていませんが、持ちネタの「仮定義」tentative defenision のよーな木が
extern は要らない子っ!!!!
0262デフォルトの名無しさん
2013/06/25(火) 21:40:53.08じゃあ番兵 #define の識別子をきみょーきてれつにするんだ!
0264デフォルトの名無しさん
2013/06/25(火) 21:48:53.53いやそれヘッダ開いてコピペされるだけだから…#pragma onceとか使うしかないっしょ
0265デフォルトの名無しさん
2013/06/25(火) 22:48:00.100266デフォルトの名無しさん
2013/06/26(水) 00:14:02.45そりゃ業務で分割コンパイルも経験した事のないヤツにはexternは不要だろうな
キーワード extern を1回も使わなくても複数の翻訳単位で系を構成することはできます(棒)
extern は要らない子っ
0268デフォルトの名無しさん
2013/06/26(水) 10:55:37.73関数のプロトタイプはexternなしでもいいし、変数もグローバル変数使わなければいいしな。
0269デフォルトの名無しさん
2013/06/26(水) 10:59:18.240270デフォルトの名無しさん
2013/06/26(水) 11:03:22.030271デフォルトの名無しさん
2013/06/26(水) 11:07:49.591.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オブジェクト指向ではないC言語はどうしても大域変数が欠かせない場面が多い
>>267は実務をしらないニートの発言
0273デフォルトの名無しさん
2013/06/26(水) 11:30:33.05手元にあったgitのソースにgrepかけてみたら、変数のexternはerrnoの一個しかなかったわ。
普通に組んでたらいらないんじゃないの。
0274273
2013/06/26(水) 11:41:12.99ごめん。
0275デフォルトの名無しさん
2013/06/26(水) 11:44:50.09変数を持たせてそのポインタを持って回る事になるが、このプログラミングスタイル
は管理が大変な上にエラーの原因になりやすい
externを使った方が遥かに楽な場面が多い
0276デフォルトの名無しさん
2013/06/26(水) 12:14:07.85グローバル変数を使うときでも制約はありますが extern キーワードを使わなくともリンクできます(棒)
0279デフォルトの名無しさん
2013/06/26(水) 12:33:09.810280デフォルトの名無しさん
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どれか一つのファイルにはexternは必要だぞ
全部書いてなかったらリンクできない
0282デフォルトの名無しさん
2013/06/26(水) 12:44:39.50こういうのは古いけど今でも立派に通用するテクニックだ
0283デフォルトの名無しさん
2013/06/26(水) 12:50:46.95どうやってリンクするの?
0284デフォルトの名無しさん
2013/06/26(水) 12:55:36.54時間の無駄だぞ
0285デフォルトの名無しさん
2013/06/26(水) 13:03:32.22「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それ関数の話?
0288デフォルトの名無しさん
2013/06/26(水) 13:06:27.26ちょっと違うなあ
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.070291デフォルトの名無しさん
2013/06/26(水) 13:39:45.880292285
2013/06/26(水) 14:08:30.530293285
2013/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>この挙動は紛らわしい為、特に必要でない限り仮定義を用いるのは避けた方が無難である。
これを正当化してるわけか
糞だな
0295デフォルトの名無しさん
2013/06/26(水) 14:56:31.49externなしでも勝手に変数をまとめちゃうような変態機能とかあんのか。
0296デフォルトの名無しさん
2013/06/26(水) 15:13:13.96老害しか使わない馬鹿機能だから知らなくていい
0297デフォルトの名無しさん
2013/06/26(水) 15:26:03.630298デフォルトの名無しさん
2013/06/26(水) 15:39:46.150299デフォルトの名無しさん
2013/06/26(水) 15:53:25.720300デフォルトの名無しさん
2013/06/26(水) 16:10:39.970301デフォルトの名無しさん
2013/06/26(水) 19:06:50.7430代で常駐先がなくなって未経験の異業種で人生やり直すのがオチ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もう無知ではない
だが使うのは奨励されない
0305デフォルトの名無しさん
2013/06/26(水) 20:43:40.94全部引数で渡せよ
0306デフォルトの名無しさん
2013/06/26(水) 20:47:37.52それでももちろんいいが、OOP言語じゃないと見通しが著しく悪くなるし、
アクセス制御も出来ないっしょ?
C言語では必要悪
0307デフォルトの名無しさん
2013/06/26(水) 20:55:28.54コンパイル時ではなく起動時に確定した後、変わることはない値とか
準マクロ的に使いたくなる
0308デフォルトの名無しさん
2013/06/26(水) 20:59:27.490309デフォルトの名無しさん
2013/06/26(水) 21:00:07.610310デフォルトの名無しさん
2013/06/26(水) 21:11:49.11規格書にもポータブルでないと明記されている。
企画書の何処に書かれているか分からないゴミクズが炎上学習企んでるだけ WWWW
0311デフォルトの名無しさん
2013/06/26(水) 21:21:12.93だからアクセス制御ないからバグが入るって
>>310
やっぱりか
クズはクズだなあ
0312デフォルトの名無しさん
2013/06/26(水) 21:22:46.79アクセス制御とか言い出したら
グローバル変数なんて完全に開けっぴろげだろw
それに構造体も隠蔽可能だぞ
ヘッダには宣言だけ書いて
全部関数を通じて操作させればいいだけ
生成は動的になるけど
0313デフォルトの名無しさん
2013/06/26(水) 21:25:38.32Cで隠蔽とか普通に可能
それができるのです(棒)
初期化せずに宣言だけする形をとれば extern なんかつける必要はありません(棒)
MASM5->MASM6 では EXTERNDEF なるディレクティブが新設されたくらい当たり前に新しい考え方
>俺はexternを省略するな、と教わった口だからな
本質を理解しないと新しいことに対応できなくなりますよね
化石言語とやらでいまだにOSが書かれている件について
リンカがね
0319デフォルトの名無しさん
2013/06/26(水) 21:50:43.65>規格書にもポータブルでないと明記されている。
でそれはどこ?具体的に引用できないようでは馬鹿が喚いているのとかわらないよね
0320デフォルトの名無しさん
2013/06/26(水) 21:51:19.31>gccではこの場合、コンパイラが解決している模様。
コンパイラがリンクするわけがない。リンカがリンクするんだ。それを書いた奴は誰?URL をさらしてくれないか?
表からみえる gcc はコンパイラドライバであってコンパイラではない
>定義と仮定義が同時に存在する場合もコンパイラが解決している模様(言うまでもなく、定義は2つ以上存在してはならない)。
定義という言葉自体が曖昧。この問題を正確に記述するのであれば、「初期化を伴う定義」と「宣言」または「仮定義」の二つのみを使うべき
初期化を伴う定義はリンクするオブジェクトのすべてにおいて二箇所以上に存在してはならない、それだけの話だ
残念ながらCならばそんなことをする必要はないMASM6だって必要なかったくらいだからねその著者もあやしいものだね
0323デフォルトの名無しさん
2013/06/26(水) 22:09:56.74inline 関数などリンク時に同一にまとめられる識別子は
「複数定義を同一にまとめる」という属性を付けるけど
それの話か?
リンカやオブジェクトファイルの仕様がCの言語仕様書に明記されるのか?かなり疑問だ
まだまだこのネタいけるね
0326デフォルトの名無しさん
2013/06/26(水) 22:18:23.060327デフォルトの名無しさん
2013/06/26(水) 22:24:02.59スレ違いだ
0328デフォルトの名無しさん
2013/06/26(水) 22:26:22.51環境依存というわりには「適用できない環境」なるものを具体的に列挙できない件について
0329デフォルトの名無しさん
2013/06/26(水) 22:33:06.23態度でかくね?
0330デフォルトの名無しさん
2013/06/26(水) 22:39:05.270331デフォルトの名無しさん
2013/06/26(水) 22:44:24.80昔からある日本の大企業の社員の雇用を守る為にIT技術者が人件費抑制のために使い捨てにされていってるだけw
0332デフォルトの名無しさん
2013/06/26(水) 23:49:57.82お前が知らないだけ。WWWW
アマゾンギフト10万円で教えてやるよ。
0333デフォルトの名無しさん
2013/06/27(木) 03:14:35.49列挙してくださいお願いいたします
0334デフォルトの名無しさん
2013/06/27(木) 09:37:43.79もう他の人が書いてるからあんたはいいよ。
0335デフォルトの名無しさん
2013/06/27(木) 10:54:04.07また来年くらいにやってみよー
0336デフォルトの名無しさん
2013/06/27(木) 12:12:21.23くだらないところに拘って時間を無駄にするよな
0337デフォルトの名無しさん
2013/06/27(木) 13:08:41.59こういう話の流れがわかない書き込みってなんなんだろう。
いろいろ考えて自分の頭の中ではなんかストーリーがあるんだろうけど、エスパーじゃないからわからない。
0338デフォルトの名無しさん
2013/06/27(木) 13:10:22.92ごくろう
話は終わったんだよ
0339デフォルトの名無しさん
2013/06/27(木) 13:11:15.130340デフォルトの名無しさん
2013/06/27(木) 13:17:22.61>>336 はエスパーだけどわからん。
0341エスパー
2013/06/27(木) 13:45:55.470342デフォルトの名無しさん
2013/06/27(木) 21:55:43.73static = private
0343デフォルトの名無しさん
2013/06/27(木) 22:25:42.00こういう定義がふくまれるヘッダーファイル
arrayを使っている(定義している)モジュールをリンクしなければarrayの領域は確保されないが、
int array[10000];
では、使う使わないに関わらず領域が確保されてしまう。
要約するとQzはうんこ
0344デフォルトの名無しさん
2013/06/27(木) 22:27:38.84要約するとQzはうんこ WWWW
0345デフォルトの名無しさん
2013/06/27(木) 22:29:37.450346デフォルトの名無しさん
2013/06/27(木) 23:35:43.97いつものお客さんがご指名よ
0347デフォルトの名無しさん
2013/06/28(金) 19:11:21.34externって実体じゃないから、違うんじゃね
0348デフォルトの名無しさん
2013/06/29(土) 00:08:36.30全然かからないのは、やはりでかいからか?
0349デフォルトの名無しさん
2013/06/29(土) 09:56:01.76今回は具体的にはsqlite3_closeを実行するとsqlite3_freeが
呼ばれているのかどうかを知りたいだけなのでドキュメントを見れば解決しそうなのですが、
普遍的にこういういのをプログラム上から調べる方法があったら教えてください。
0350デフォルトの名無しさん
2013/06/29(土) 10:00:09.50> 普遍的に
ない。
以上。
0351デフォルトの名無しさん
2013/06/29(土) 10:11:15.42ない
必要なら自分でアロケータを書くしかない
0352デフォルトの名無しさん
2013/06/29(土) 11:54:53.530353デフォルトの名無しさん
2013/06/29(土) 12:00:32.81今回は具体的にはsqlite3_closeを実行するとsqlite3_freeが
呼ばれているのかどうかを知りたいだけなのでドキュメントを見れば解決しそうなのですが、
普遍的にこういういのをプログラム上から調べる方法があったら教えてください。
0354デフォルトの名無しさん
2013/06/29(土) 12:09:23.930355デフォルトの名無しさん
2013/06/29(土) 12:12:49.27freeを全部上に置き換えてpがNULLだったらfree済みだし何回でもfreeすればいい
0356デフォルトの名無しさん
2013/06/29(土) 12:50:15.90それはFREEされたかどうか、NULLが入ってるかどうかを調べるということであって、
freeされたかどうかを知る手段ではない。
質問の意図が分からないゴミはカキコするな。
0357デフォルトの名無しさん
2013/06/29(土) 12:57:48.430358デフォルトの名無しさん
2013/06/29(土) 13:22:22.73そのうち、例外が発生してくれる
0359デフォルトの名無しさん
2013/06/29(土) 13:24:00.87メモリプールだったらアウト
0360デフォルトの名無しさん
2013/06/29(土) 13:42:36.64sqlite3_close 内で sqlite3_free が呼ばれるかまで含んだ話だから
free をマクロで置き換えるとかじゃどうしようもない
sqlite3_close の実装が変更できる状況であればソースがあるわけで、
sqlite3_free を呼んでるかはソース読めば分かるわけだし、
最悪分からなくてもログ仕込めばいい
実装を変更できない状況でどうするかとなると、
free や sqlite3_free などの後に実行するとエラーになる処理や
free や sqlite3_free などによるメモリ上の何らかの変化の存在が分かれば、それで判別できる
あとはリバースエンジニアリング、
あるいはライブラリファイル内の free や sqlite3_free などのコードを
ログ出すだけの処理に改竄するとか
■ このスレッドは過去ログ倉庫に格納されています