!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 157
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
2021/06/28(月) 11:22:51.50ID:so+vl3vs0583デフォルトの名無しさん (ワッチョイ 171d-QiSa)
2021/09/17(金) 16:26:05.73ID:J/w/zJeW0 シリコンバレーで働いて気付いた「技術力向上」だけに固執するエンジニアのダメさ【Sansan CTO 藤倉成太】
https://type.jp/et/feature/9402/
DeNA×メルカリ×サイバーエージェント人事担当が面接で必ずする質問とは?「技術力だけアピールしても内定は出ない」
https://type.jp/et/feature/10236/
DeNA・メルカリ・CA人事が証言! スキルはあるのに“面接で落ちる”エンジニアに足りないもの
https://type.jp/et/feature/10402/
https://type.jp/et/feature/9402/
DeNA×メルカリ×サイバーエージェント人事担当が面接で必ずする質問とは?「技術力だけアピールしても内定は出ない」
https://type.jp/et/feature/10236/
DeNA・メルカリ・CA人事が証言! スキルはあるのに“面接で落ちる”エンジニアに足りないもの
https://type.jp/et/feature/10402/
584デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/17(金) 20:48:41.30ID:M17TGSOPM585はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/17(金) 20:59:27.14ID:hv2MZm4l0 >>584
JVM のバイトコードは言語ではないと思うから高級言語とは言わないけど、低水準でもないでしょ。
JVM のバイトコードは言語ではないと思うから高級言語とは言わないけど、低水準でもないでしょ。
586デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/17(金) 21:50:22.49ID:/PAMmlQoM 低水準の話はしてないから
> 高級言語とは言わない
でFAやね
> 高級言語とは言わない
でFAやね
587はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/17(金) 22:00:48.37ID:hv2MZm4l0 そうか。
588デフォルトの名無しさん (ワッチョイ 1763-qDHA)
2021/09/17(金) 22:31:46.08ID:C7S/bCm80 C言語だってコンパイルすればバイナリ
589デフォルトの名無しさん (ワッチョイ 9fad-qDHA)
2021/09/18(土) 04:33:04.80ID:iNoegsL20 倍也
590デフォルトの名無しさん (エムゾネ FFbf-hED7)
2021/09/18(土) 08:52:55.38ID:bA/qQPAiF バイトコードをいい加減に扱い過ぎ
591デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/18(土) 09:19:07.92ID:1ehO0L4U0 >>580
特定CPUのアーキテクチャに言及してないな
特定CPUのアーキテクチャに言及してないな
592デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
2021/09/18(土) 18:56:12.62ID:RjbxwxKL0 宣言と定義についてなんですが
int a; // 宣言
int b = 1; // 定義
宣言と定義ではどちらもメモリ(スタック)は確保されているという理解であってますか?
int a; // 宣言
int b = 1; // 定義
宣言と定義ではどちらもメモリ(スタック)は確保されているという理解であってますか?
593デフォルトの名無しさん (ワッチョイ 1763-qDHA)
2021/09/18(土) 19:10:22.14ID:bsPUoCV00 はい
594デフォルトの名無しさん (ワッチョイ 1fbd-SDcz)
2021/09/18(土) 19:28:32.87ID:I+biH5jK0 はいじゃないが
595デフォルトの名無しさん (ワッチョイ bfe9-IhC7)
2021/09/18(土) 19:42:16.97ID:jTQBMDyZ0596デフォルトの名無しさん (ワッチョイ ff61-IhC7)
2021/09/18(土) 19:43:03.59ID:XFa1Ksn/0 コンパイラと最適化オプション次第
597デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
2021/09/18(土) 19:48:26.79ID:RjbxwxKL0 >>595
定義は宣言の下位概念ってことですか?
定義は宣言の下位概念ってことですか?
598ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/18(土) 19:55:00.96ID:/DXMasS60 >>592
いいえ
定義では格納場所を確保しますが、宣言では存在のみ指示しても格納場所は確保されません、私は気が向けば宣言には extern をつけるようにしないわけではない、という感じかな
なおその例は少し変で、代入を伴えば定義というわけでも、代入がなければ宣言というわけでもない、というのが個人的感覚です、詳しい人の解説を希望します
例外は、リンカが頑張って格納場所を作ってくれる例の何とかとかいうキーワードがあったのですがおもいだせません、今日モデルナを射った後転んで頭を打ってしまった、結果、いっそう馬鹿になってしまいました‥‥
いいえ
定義では格納場所を確保しますが、宣言では存在のみ指示しても格納場所は確保されません、私は気が向けば宣言には extern をつけるようにしないわけではない、という感じかな
なおその例は少し変で、代入を伴えば定義というわけでも、代入がなければ宣言というわけでもない、というのが個人的感覚です、詳しい人の解説を希望します
例外は、リンカが頑張って格納場所を作ってくれる例の何とかとかいうキーワードがあったのですがおもいだせません、今日モデルナを射った後転んで頭を打ってしまった、結果、いっそう馬鹿になってしまいました‥‥
599ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/18(土) 20:04:32.98ID:/DXMasS60 >>592
宣言か定義か、という問題は、単一モジュールでプログラムを構成している段階ではあまり気にしなくてもいいと思います
複数の c ソースを分割コンパイルし、最後に得られたオブジェクトをライブラリともあわせて結合する、という作法に進めば自然に理解できるようになりますのでご心配なさらなくともいいでしょう
私も昔は「extern は要らない子!」とか馬鹿をいっていましたが、これは撤回します、extern がどうしても必要な場面に遭遇したのです
まあそういうわけで一度にいっぺんに賢くなるのは私には難しいことのようです
宣言か定義か、という問題は、単一モジュールでプログラムを構成している段階ではあまり気にしなくてもいいと思います
複数の c ソースを分割コンパイルし、最後に得られたオブジェクトをライブラリともあわせて結合する、という作法に進めば自然に理解できるようになりますのでご心配なさらなくともいいでしょう
私も昔は「extern は要らない子!」とか馬鹿をいっていましたが、これは撤回します、extern がどうしても必要な場面に遭遇したのです
まあそういうわけで一度にいっぺんに賢くなるのは私には難しいことのようです
600デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
2021/09/18(土) 20:41:39.21ID:RjbxwxKL0 >>598
たとえば
int a;
printf("%d\n", a);
なんですが、この場合のaは定義されているということですか?
代入式があるのが定義だと思ってました
宣言と定義の文脈はコードによって変わるということなんですかね
たとえば
int a;
printf("%d\n", a);
なんですが、この場合のaは定義されているということですか?
代入式があるのが定義だと思ってました
宣言と定義の文脈はコードによって変わるということなんですかね
601デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/18(土) 21:25:06.90ID:JTl7f6jwM 簡単に言えば宣言はその名前をコンパイラに伝えるもの
定義はその実体を確保するためのもの
>>592の例は両方共に宣言であり定義でもある
C言語では定義のみすると言うのはできないと思う
宣言のみはexternとか前方参照のためのstruct xxx;とかで使われる
定義はその実体を確保するためのもの
>>592の例は両方共に宣言であり定義でもある
C言語では定義のみすると言うのはできないと思う
宣言のみはexternとか前方参照のためのstruct xxx;とかで使われる
602デフォルトの名無しさん (ワッチョイ 97da-jOHa)
2021/09/18(土) 21:44:48.00ID:YluaRA/40 >>596
屁理屈こねんなやボケが
屁理屈こねんなやボケが
603デフォルトの名無しさん (ワッチョイ bfe9-IhC7)
2021/09/18(土) 22:06:39.93ID:jTQBMDyZ0604デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
2021/09/18(土) 22:22:54.90ID:RjbxwxKL0605デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/18(土) 22:32:01.92ID:vqHZXwmna606デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/18(土) 22:36:06.58ID:/Dm63BCIM607デフォルトの名無しさん (ワッチョイ b7bb-qDHA)
2021/09/18(土) 22:53:55.61ID:RjbxwxKL0608デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/18(土) 23:32:59.41ID:vqHZXwmna aは定義されている、でよいと思います
ちなみに、自分は宣言とか定義とか「言葉」は意識しないです
ただ、ここにオブジェクトが実在するのか、他のどこかにあるオブジェクトを使うのかは明確に意識しなければなりません
int main(void) {
int a;
extern int x:
return 0;
}
ここで xは、関数外のどこかで定義された int型のオブジェクを参照します、という宣言
ちなみに、自分は宣言とか定義とか「言葉」は意識しないです
ただ、ここにオブジェクトが実在するのか、他のどこかにあるオブジェクトを使うのかは明確に意識しなければなりません
int main(void) {
int a;
extern int x:
return 0;
}
ここで xは、関数外のどこかで定義された int型のオブジェクを参照します、という宣言
609ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/18(土) 23:37:35.98ID:/DXMasS60 >>607
そうですね
それに、そのコードは関数 int main(void) も宣言かつ定義していますね
関数の場合は、関数の中身が書いておれば宣言かつ定義、関数の呼び出され方だけしか書いていなければ宣言、とすぐにわかるので、キーワード extern は省かれる傾向にありますね
詳しい人に解説いただき私も感謝します
そうですね
それに、そのコードは関数 int main(void) も宣言かつ定義していますね
関数の場合は、関数の中身が書いておれば宣言かつ定義、関数の呼び出され方だけしか書いていなければ宣言、とすぐにわかるので、キーワード extern は省かれる傾向にありますね
詳しい人に解説いただき私も感謝します
610デフォルトの名無しさん (ワッチョイ 1763-qDHA)
2021/09/18(土) 23:38:56.69ID:bsPUoCV00 質問
externを関数内で宣言したとき、有効範囲は次のどれになりますか?
1.宣言した関数のスコープ内で有効
2.宣言したソースの後続行で有効
3.宣言を書いたソースの全体で有効
externを関数内で宣言したとき、有効範囲は次のどれになりますか?
1.宣言した関数のスコープ内で有効
2.宣言したソースの後続行で有効
3.宣言を書いたソースの全体で有効
611デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/18(土) 23:43:44.98ID:vqHZXwmna A.1
612デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/18(土) 23:45:59.85ID:vqHZXwmna 通常の変数と同様に、ブロック {} で括られるかと
613はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/19(日) 00:58:34.79ID:aMl1OG4b0 JISX3010:2003 の 6.7 から抜粋
> 宣言は、幾つかの識別子の解釈及び属性を指定する。
> 識別子の定義 (definition) とは、宣言のうち次のものをいう。
> ・オブジェクトに対しては、そのオブジェクトの記憶域を確保する宣言
> ・関数に対しては、関数本体を含む宣言
> ・列挙定数又は型定義名に対しては、その識別子の(唯一の)宣言
> 宣言は、幾つかの識別子の解釈及び属性を指定する。
> 識別子の定義 (definition) とは、宣言のうち次のものをいう。
> ・オブジェクトに対しては、そのオブジェクトの記憶域を確保する宣言
> ・関数に対しては、関数本体を含む宣言
> ・列挙定数又は型定義名に対しては、その識別子の(唯一の)宣言
614デフォルトの名無しさん (アウアウウー Sa5b-hED7)
2021/09/19(日) 12:56:33.95ID:/yxUr6Cya 関数の中とか{}ブロックの中とかで
#include とか #define 出来れば良いのにと思うことはある
(いや出来ることは出来るけど)
#include とか #define 出来れば良いのにと思うことはある
(いや出来ることは出来るけど)
615デフォルトの名無しさん (ワッチョイ f737-tt/w)
2021/09/19(日) 14:00:14.49ID:k97hf5Wx0 >614
その辺は古い仕様の限界だから……
その辺は古い仕様の限界だから……
616デフォルトの名無しさん (ワッチョイ 97da-jOHa)
2021/09/19(日) 14:08:34.86ID:dcXPbcRy0617デフォルトの名無しさん (ガラプー KK4f-cmG/)
2021/09/19(日) 15:49:36.39ID:1EdICjsOK618デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/19(日) 16:19:30.05ID:gqeRua+ma // foo.c
#include <stdio.h>
int f(void)
{
extern int glob:
return glob + 1;
}
int main()
{
printf("%d\n", f()); // 124(次行がないとき)
printf("%d\n", glob); // エラー
return 0:
}
// bar.c
int glob = 123;
でした
勘違いだったらごめんなさい
#include <stdio.h>
int f(void)
{
extern int glob:
return glob + 1;
}
int main()
{
printf("%d\n", f()); // 124(次行がないとき)
printf("%d\n", glob); // エラー
return 0:
}
// bar.c
int glob = 123;
でした
勘違いだったらごめんなさい
619デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/19(日) 16:24:53.88ID:gqeRua+ma int f(void)
{
__{
____extern int glob:
__}
__return glob + 1; // glob undeclared
}
{
__{
____extern int glob:
__}
__return glob + 1; // glob undeclared
}
620デフォルトの名無しさん (ワッチョイ d721-cDqY)
2021/09/19(日) 18:52:30.28ID:AMdE/BCe0 extern の変数をスコープ内に書きたい場面ってあまり思いつかない。
ヘッダファイルに書くのサボりたい時くらいしかそんな書き方しないな〜
ヘッダファイルに書くのサボりたい時くらいしかそんな書き方しないな〜
621デフォルトの名無しさん (アウアウウー Sa5b-XGHE)
2021/09/19(日) 19:48:44.86ID:gqeRua+ma622デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/19(日) 19:52:36.17ID:tWZRSjBtM >>620
俺はそのスコープでしか使わないなら普通にスコープ内に書くけど?
俺はそのスコープでしか使わないなら普通にスコープ内に書くけど?
623621 (アウアウウー Sa5b-XGHE)
2021/09/19(日) 20:02:10.63ID:gqeRua+ma624デフォルトの名無しさん (ワッチョイ 9f63-qDHA)
2021/09/19(日) 20:34:55.88ID:qdWHvjUr0 ひょっとして、#define も関数内で記述すると
そのスコープ内で有効になるのかな?
そのスコープ内で有効になるのかな?
625デフォルトの名無しさん (ワッチョイ d721-cDqY)
2021/09/19(日) 20:40:54.81ID:AMdE/BCe0 >>624
流石にそれはない。
流石にそれはない。
626621 (アウアウウー Sa5b-XGHE)
2021/09/19(日) 20:42:46.70ID:gqeRua+ma #includeとか #defineとか、プリプロセッサが処理する時点では、スコープとか、C言語の文法すら関知しないかも
トークンの
識別くらいで
トークンの
識別くらいで
627デフォルトの名無しさん (ワッチョイ d721-uvbS)
2021/09/19(日) 21:23:46.86ID:AMdE/BCe0 こんな #define 見たくないけど・・・
---------------------------------------
void func() {
#define A 100
}
int main() {
int i = A;
}
---------------------------------------
gcc -E prepro.c
---------------------------------------
# 1 "prepro.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 384 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "prepro.c" 2
void func() {
}
int main() {
int i = 100;
}
---------------------------------------
---------------------------------------
void func() {
#define A 100
}
int main() {
int i = A;
}
---------------------------------------
gcc -E prepro.c
---------------------------------------
# 1 "prepro.c"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 384 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "prepro.c" 2
void func() {
}
int main() {
int i = 100;
}
---------------------------------------
628デフォルトの名無しさん (ワッチョイ 775f-hED7)
2021/09/20(月) 10:14:32.45ID:rmuhdvcF0 Cにnamespaceが無いのが逝けない娘
629デフォルトの名無しさん (ワッチョイ 97da-jOHa)
2021/09/20(月) 15:37:40.46ID:ql5RJosy0 いらねぇだろネームスペースなんか
630デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/20(月) 16:28:35.49ID:WSYscKBB0 namespaceが欲しいのにC++を使わないのが逝けない娘
太古の昔、Cにクラスが無いのが逝けない娘だと思った人とは行動力が違いすぎるな
太古の昔、Cにクラスが無いのが逝けない娘だと思った人とは行動力が違いすぎるな
631デフォルトの名無しさん (ワッチョイ 9fad-qDHA)
2021/09/20(月) 17:39:30.67ID:WNFThOB/0 CはCのままで良い。他の言語で実現出来ているんだし。その機能を使いたいならそちらの言語を使えば良い。
それでは何かが足りないというのなら新言語作れば良い。
自分では作る技術力がなくても仕様を考えてネットで公開しておけばやがて暇と技術力のある誰かが作ってくれるだろう。
それでは何かが足りないというのなら新言語作れば良い。
自分では作る技術力がなくても仕様を考えてネットで公開しておけばやがて暇と技術力のある誰かが作ってくれるだろう。
632デフォルトの名無しさん (ワッチョイ f737-tt/w)
2021/09/20(月) 18:06:11.00ID:xT0MCUkn0 >622
型を間違えてもエラーにならないから全くお勧めしない
型を間違えてもエラーにならないから全くお勧めしない
633デフォルトの名無しさん (テテンテンテン MM8f-vJdV)
2021/09/20(月) 19:39:36.63ID:QS4OJe2QM634デフォルトの名無しさん (ワッチョイ ffbb-liuG)
2021/09/20(月) 19:50:34.34ID:vvw4JppL0 ミスする可能性が上がるから各コードでexternせずに必要ならヘッダに書いてもらえってことじゃね?
そもそもexternなんてextern "C"以外滅多に使わないけどな
そもそもexternなんてextern "C"以外滅多に使わないけどな
635デフォルトの名無しさん (ワッチョイ 1fbd-SDcz)
2021/09/20(月) 19:57:31.48ID:LO5PkHvF0 >>633
前スレより
975 デフォルトの名無しさん (ワッチョイ b363-19dE) sage 2021/06/21(月) 23:06:35.04 ID:jHz8GYW10
// b.c
int b[] = {123, 456};
// a.c
#include <stdio.h>
int a[] = {123, 456};
int main()
{
extern int *b;
printf("val b\n");
printf("%d\n", *(b + 1));
// printf("val a\n");
// printf("%d\n", *(a + 1));
return 0;
}
こういう分割ソースをコンパイル、リンクして実行すると、何も表示無しで終了する
デバッガー使って実行してみると、SEGVになってる
前スレより
975 デフォルトの名無しさん (ワッチョイ b363-19dE) sage 2021/06/21(月) 23:06:35.04 ID:jHz8GYW10
// b.c
int b[] = {123, 456};
// a.c
#include <stdio.h>
int a[] = {123, 456};
int main()
{
extern int *b;
printf("val b\n");
printf("%d\n", *(b + 1));
// printf("val a\n");
// printf("%d\n", *(a + 1));
return 0;
}
こういう分割ソースをコンパイル、リンクして実行すると、何も表示無しで終了する
デバッガー使って実行してみると、SEGVになってる
636ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/20(月) 20:10:17.55ID:+hQanlE40 >>634
>ミスする可能性が上がるから各コードでexternせずに必要ならヘッダに書いてもらえってことじゃね?
そうそう、extern による宣言と定義とが食い違うとエラーがでますから、そのためのヘッダの分離ということですね
>そもそもexternなんてextern "C"以外滅多に使わないけどな
関数の宣言は extern 省略可能ですし、ライブラリ側で共用のメモリを確保することは滅多にないです私は
>ミスする可能性が上がるから各コードでexternせずに必要ならヘッダに書いてもらえってことじゃね?
そうそう、extern による宣言と定義とが食い違うとエラーがでますから、そのためのヘッダの分離ということですね
>そもそもexternなんてextern "C"以外滅多に使わないけどな
関数の宣言は extern 省略可能ですし、ライブラリ側で共用のメモリを確保することは滅多にないです私は
637621 (アウアウウー Sa5b-XGHE)
2021/09/20(月) 23:40:17.11ID:y5y6BCAna >>635
これは関数のスコープに書かなくても(ファイルスコープでも)同じじゃない?
これは関数のスコープに書かなくても(ファイルスコープでも)同じじゃない?
638621 (アウアウウー Sa5b-XGHE)
2021/09/21(火) 00:23:33.65ID:7n0ZYlgRa639デフォルトの名無しさん (ワッチョイ 1fbd-SDcz)
2021/09/21(火) 00:26:56.39ID:aEoN/PBD0 >>637
同じですね
そもそもexternを明示的に書く必要がある状況って、
あるソースで定義されているグローバル変数を他のソースに公開して使えるようにするために、
ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
(すると他のソースでは余計な領域が確保されない)
のパターンが基本だと思っています
だからそもそもブロックスコープでexternするのってなんで? 覗き魔? って思ってしまう
同じですね
そもそもexternを明示的に書く必要がある状況って、
あるソースで定義されているグローバル変数を他のソースに公開して使えるようにするために、
ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
(すると他のソースでは余計な領域が確保されない)
のパターンが基本だと思っています
だからそもそもブロックスコープでexternするのってなんで? 覗き魔? って思ってしまう
640デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/21(火) 03:22:03.74ID:rkkhSUpi0 ブロックスコープ内でexternはK&R C時代の名残で今は完全に無意味
641デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/21(火) 03:23:48.34ID:rkkhSUpi0 関数原型でのexternは単項プラスみたいなもん
staticじゃないよと強調する反対語
staticじゃないよと強調する反対語
642ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/21(火) 03:36:19.96ID:9i80hc760 >>639
>ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
「他のソース」でないソースも、そのヘッダを #include しておけばダチェックにもなるし
>ヘッダにextern int a;のように書いておいて、他のソースにはそれを#includeさせる
「他のソース」でないソースも、そのヘッダを #include しておけばダチェックにもなるし
643デフォルトの名無しさん (ワッチョイ f737-tt/w)
2021/09/21(火) 19:14:32.01ID:8eqDWQ5I0644621 (アウアウウー Sa5b-XGHE)
2021/09/21(火) 22:41:16.78ID:rS8f3YVDa // b.c
char a[] = { 0, 1 };
// a.c
int main()
{
__extern int *a;
__printf("%d\n", a[1]):
__return 0;
}
不勉強でした
上のコードは警告もなしにコンパイルが通りますね
実行すると segmentation fault ですが
リンク時はデータ型はチェックされず、名前だけで参照を解決してるのですかね……
古い仕様で、今さら変更はできないんでしょうね、チェックができたとしても
char a[] = { 0, 1 };
// a.c
int main()
{
__extern int *a;
__printf("%d\n", a[1]):
__return 0;
}
不勉強でした
上のコードは警告もなしにコンパイルが通りますね
実行すると segmentation fault ですが
リンク時はデータ型はチェックされず、名前だけで参照を解決してるのですかね……
古い仕様で、今さら変更はできないんでしょうね、チェックができたとしても
645デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/21(火) 22:46:25.12ID:rkkhSUpi0 型システムを持たずラベルの綴りのみを手がかりに参照解決するリンカを操るツールの1つだからねCは
リンカにあれもこれもと機能を持たせるのはメインフレームのファイルシステムにあれもこれも持たせようとしたVSAMの再来だ
インフラ的なものにアプリの都合を無闇に押しつけるべきではないことを歴史から学ぶべきだぞ
リンカにあれもこれもと機能を持たせるのはメインフレームのファイルシステムにあれもこれも持たせようとしたVSAMの再来だ
インフラ的なものにアプリの都合を無闇に押しつけるべきではないことを歴史から学ぶべきだぞ
646はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/21(火) 23:19:06.05ID:tYtQqya30 C には「プロトタイプ (関数原型) を持たない関数宣言」があって、
関数の型が曖昧なまま関数が存在することだけを宣言できる。
プロトタイプ (プロトタイプ宣言) がある場合にはその関数を呼出すにあたって実引数と仮引数の間では代入と同じ規則
で (可能な場合には) 暗黙の型変換が適用されるが、プロトタイプがない場合には
既定の実引数拡張 (可変長引数に実引数を渡すときと同じ規則) が適用されて実引数と仮引数の辻褄が
あってないときは未定義という扱いになる。
更には C89 は暗黙の関数宣言という規則があって (C99 では廃止されている)
関数を呼出そうとした時点で関数が宣言されていない場合には実引数の型から一定の規則に基づいて
関数の型を推測し、関数が宣言されたかのように振る舞うことになっている。
なので関数宣言が存在しなくても二度以上の関数呼出しの型に矛盾があれば検出はされる。
もちろん関数定義の実体と辻褄があってなかったらそれは未定義だけど。
このあたりのクソみたいな規則は「C++ では採用しなかった仕様」として D&E でちょっと触れられてる。
関数の型が曖昧なまま関数が存在することだけを宣言できる。
プロトタイプ (プロトタイプ宣言) がある場合にはその関数を呼出すにあたって実引数と仮引数の間では代入と同じ規則
で (可能な場合には) 暗黙の型変換が適用されるが、プロトタイプがない場合には
既定の実引数拡張 (可変長引数に実引数を渡すときと同じ規則) が適用されて実引数と仮引数の辻褄が
あってないときは未定義という扱いになる。
更には C89 は暗黙の関数宣言という規則があって (C99 では廃止されている)
関数を呼出そうとした時点で関数が宣言されていない場合には実引数の型から一定の規則に基づいて
関数の型を推測し、関数が宣言されたかのように振る舞うことになっている。
なので関数宣言が存在しなくても二度以上の関数呼出しの型に矛盾があれば検出はされる。
もちろん関数定義の実体と辻褄があってなかったらそれは未定義だけど。
このあたりのクソみたいな規則は「C++ では採用しなかった仕様」として D&E でちょっと触れられてる。
647デフォルトの名無しさん (ワッチョイ 1745-I/Yj)
2021/09/21(火) 23:25:07.21ID:rkkhSUpi0 > 実引数の型から一定の規則に基づいて関数の型を推測し
func(1);
↓
int func();
func("string");
↓
int func();
こうなるだけで推測なんて気の利いたことはしないよ
func(1);
↓
int func();
func("string");
↓
int func();
こうなるだけで推測なんて気の利いたことはしないよ
648621 (アウアウウー Sa5b-XGHE)
2021/09/21(火) 23:27:49.11ID:rS8f3YVDa プロトタイプ宣言は C++からの逆輸入だからな….
その昔の Cったら
その昔の Cったら
649はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/21(火) 23:34:12.47ID:tYtQqya30 >>647
あ、ほんまやな。
仕様上のルールは「extern int func(); が書かれていたものとみなす」というだけで、
具体的なチェックをどこまでするかは処理系次第 (たぶんあまり真面目にやってなかったと思うけど) だな。
あ、ほんまやな。
仕様上のルールは「extern int func(); が書かれていたものとみなす」というだけで、
具体的なチェックをどこまでするかは処理系次第 (たぶんあまり真面目にやってなかったと思うけど) だな。
650デフォルトの名無しさん (ワッチョイ ff46-bwRU)
2021/09/22(水) 05:28:22.60ID:iWoXuoBc0651デフォルトの名無しさん (ワッチョイ 9fad-QxrA)
2021/09/22(水) 14:25:23.40ID:Te29kBsr0 どうだったっけなあ?
652はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/22(水) 14:32:16.52ID:1hd+XsHu0 The C programming language (いわゆる K&R 第一版) の
APPENDIX A 8.3 Declarators を見る限りでは
引数リストが空の形式しかないように見える。
関数であるということは宣言できるが型チェックはガバガバっぽい。
D&E の 2.6 静的タイプチェック の項では
> C with Classes のシンタクスとルールはその後 ANSI C の規格にも採用されたが
> C with Classes の最初の実装の時点ですでに完全な形をしていた。
という一文があるので C の型チェックは C++ (の前身である C with Classes)
からの影響ということで間違いないと思う。
APPENDIX A 8.3 Declarators を見る限りでは
引数リストが空の形式しかないように見える。
関数であるということは宣言できるが型チェックはガバガバっぽい。
D&E の 2.6 静的タイプチェック の項では
> C with Classes のシンタクスとルールはその後 ANSI C の規格にも採用されたが
> C with Classes の最初の実装の時点ですでに完全な形をしていた。
という一文があるので C の型チェックは C++ (の前身である C with Classes)
からの影響ということで間違いないと思う。
653デフォルトの名無しさん (エムゾネ FFbf-hED7)
2021/09/22(水) 14:42:52.46ID:KzVGjGnLF 初耳だわ
はちみつは何歳?
はちみつは何歳?
654デフォルトの名無しさん (ワッチョイ bfe7-I/Yj)
2021/09/22(水) 15:34:35.81ID:p7uTNZa70 47歳くらいだと思う
655ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/22(水) 17:51:09.10ID:z5uxQYPx0 >>644
そのコード、仮に a.c で
extern int *a;
ではなくて
extern char *a;
であってもセグフォが出ると思います、試してませんけど‥‥
なにか二重に勘違いしてませんか?それとも私が二重に勘違いしているのか?
そのコード、仮に a.c で
extern int *a;
ではなくて
extern char *a;
であってもセグフォが出ると思います、試してませんけど‥‥
なにか二重に勘違いしてませんか?それとも私が二重に勘違いしているのか?
656はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/22(水) 18:02:31.76ID:1hd+XsHu0 >>655
配列として定義したものをポインタとして宣言するのは間違いだな。
配列として定義したものをポインタとして宣言するのは間違いだな。
657はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/22(水) 18:04:06.47ID:1hd+XsHu0 FAQ に書いてあったわ。
http://www.c-faq.com/aryptr/aryptr1.html
http://www.c-faq.com/aryptr/aryptr1.html
658デフォルトの名無しさん (ブーイモ MM8f-liuG)
2021/09/22(水) 18:35:41.60ID:Il91zgnyM 47歳
研究部門に所属
趣味は手芸
研究部門に所属
趣味は手芸
659621 (アウアウウー Sa5b-XGHE)
2021/09/22(水) 19:31:52.27ID:u8cZI69ma >>655
ありがとうございます
はい、char と char でもダメですね
データ型がことなれば、リンケージできないのではと思い実験してみました
定義側でメモリに配置されているのは値で、extern宣言で参照する側が期待するのはポインタが配置されていることなのでうまくいきませんね(違うかな)
ありがとうございます
はい、char と char でもダメですね
データ型がことなれば、リンケージできないのではと思い実験してみました
定義側でメモリに配置されているのは値で、extern宣言で参照する側が期待するのはポインタが配置されていることなのでうまくいきませんね(違うかな)
661デフォルトの名無しさん (ワッチョイ 9f69-5MQP)
2021/09/23(木) 08:15:49.41ID:0q4HMCJB0 >>638
変数に対しても型情報付加したマングリングするぐらいかねぇ?
変数に対しても型情報付加したマングリングするぐらいかねぇ?
663ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/23(木) 10:02:57.46ID:HaJtCNmP0664ハノン ◆QZaw55cn4c (ワッチョイ 9f47-o3tO)
2021/09/23(木) 13:38:03.01ID:HaJtCNmP0 >>658
ほとんどプロの人‥‥完璧なアマは私くらいですか
ほとんどプロの人‥‥完璧なアマは私くらいですか
665はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-IhC7)
2021/09/23(木) 16:56:05.29ID:pKS1sRJG0 COFF フォーマットを見てるんだが、
関数が返す値の型を格納するところは有っても引数の型については無いみたいだ。
http://delorie.com/djgpp/doc/coff/symtab.html
ヘッダファイルで型情報をやりとりする前提なんだな。
ELF だとたぶん詳細な型も入れられそうな雰囲気があるんだけど複雑でようわからん……。
関数が返す値の型を格納するところは有っても引数の型については無いみたいだ。
http://delorie.com/djgpp/doc/coff/symtab.html
ヘッダファイルで型情報をやりとりする前提なんだな。
ELF だとたぶん詳細な型も入れられそうな雰囲気があるんだけど複雑でようわからん……。
666デフォルトの名無しさん (ワッチョイ d31b-QjBH)
2021/09/24(金) 19:26:12.39ID:bEXGgTP60 もしかしてc言語って新たにブロック文つくったら構造体の二重定義って可能になるんですか?
試しに
{
struct a{};
{
struct a{};
}
}
ってcompiler explorerで打ち込んだらcompile通りました。
こんなの初耳です。
ちなみに同じブロック文で二重定義したらcompile errorが起こりました。
試しに
{
struct a{};
{
struct a{};
}
}
ってcompiler explorerで打ち込んだらcompile通りました。
こんなの初耳です。
ちなみに同じブロック文で二重定義したらcompile errorが起こりました。
667ハノン ◆QZaw55cn4c (ワッチョイ b247-+9yW)
2021/09/24(金) 20:31:56.55ID:B0dAhYuN0 >>659
今回の例でもわかるように、無節操にバンバン extern 宣言を複数の C ソースファイルのあちこちに混入させるのは非常にマズイので、
普通はサブモジュールの extern 宣言だけを別のファイルにまとめておいて、そのサブモジュールを使用するソースで #include するのが標準的です
この extern 宣言だけをまとめたファイルを特にヘッダファイルと呼びます
https://ideone.com/rdbae2
実体を定義したサブモジュールもヘッダを #include するようにしておけば、ヘッダの誤りも検出することができます
なにかこういう基本文法を終えた後に位置するべき基本的な作法集をまとめたアドバンス教科書、みたいなものはないものでしょうか?
今回の例でもわかるように、無節操にバンバン extern 宣言を複数の C ソースファイルのあちこちに混入させるのは非常にマズイので、
普通はサブモジュールの extern 宣言だけを別のファイルにまとめておいて、そのサブモジュールを使用するソースで #include するのが標準的です
この extern 宣言だけをまとめたファイルを特にヘッダファイルと呼びます
https://ideone.com/rdbae2
実体を定義したサブモジュールもヘッダを #include するようにしておけば、ヘッダの誤りも検出することができます
なにかこういう基本文法を終えた後に位置するべき基本的な作法集をまとめたアドバンス教科書、みたいなものはないものでしょうか?
668621 (アウアウウー Sa43-LUZf)
2021/09/24(金) 20:48:31.47ID:PKobCCv1a669ハノン ◆QZaw55cn4c (ワッチョイ b247-+9yW)
2021/09/24(金) 20:54:31.27ID:B0dAhYuN0670デフォルトの名無しさん (ワッチョイ d31b-QjBH)
2021/09/24(金) 22:23:44.15ID:bEXGgTP60671デフォルトの名無しさん (ワッチョイ d31b-QjBH)
2021/09/24(金) 22:25:13.81ID:bEXGgTP60672ハノン ◆QZaw55cn4c (ワッチョイ b247-+9yW)
2021/09/25(土) 06:49:29.05ID:YrZFQiAF0673デフォルトの名無しさん (ワッチョイ 1ee9-2Lmd)
2021/09/25(土) 11:02:06.77ID:dAtBdpVF0 >>670
> 同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます
その「当たり前」の規則は変数名に限ったものじゃくて構造体タグ名についても同じ規則が適用される。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
6.2.1 Scopes of identifiers
> A label name is the only kind of identifier that has function scope. ...
>
> Every other identifier has scope determined by the placement of its declaration (in a declarator or
> type specifier). ...
> ...
> ... the scope of one entity (the inner scope) will end strictly before the scope of the other
> entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the
> inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.
ただし変数名とタグ名とでは名前空間 (name space) が異なる。
> 同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます
その「当たり前」の規則は変数名に限ったものじゃくて構造体タグ名についても同じ規則が適用される。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
6.2.1 Scopes of identifiers
> A label name is the only kind of identifier that has function scope. ...
>
> Every other identifier has scope determined by the placement of its declaration (in a declarator or
> type specifier). ...
> ...
> ... the scope of one entity (the inner scope) will end strictly before the scope of the other
> entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the
> inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.
ただし変数名とタグ名とでは名前空間 (name space) が異なる。
674デフォルトの名無しさん (エムゾネ FF32-kEnG)
2021/09/25(土) 11:05:50.70ID:lBxoEpbFF {
int a;
{
int a;
}
}
とやってることは同じ
int a;
{
int a;
}
}
とやってることは同じ
675デフォルトの名無しさん (ワッチョイ f2a4-X0+7)
2021/09/25(土) 16:07:19.71ID:Uwq7lnPV0 >>666
二重定義じゃなくて、入れ子構造の中での定義にすぎないからでは?
イメージとしては、コンパイラとしては、外側の構造体は
struct XX_a {}
内側の構造体は
struct X_a_a{}
みたいな感じで管理してコード展開してるだけ。
二重定義じゃなくて、入れ子構造の中での定義にすぎないからでは?
イメージとしては、コンパイラとしては、外側の構造体は
struct XX_a {}
内側の構造体は
struct X_a_a{}
みたいな感じで管理してコード展開してるだけ。
676デフォルトの名無しさん (ワッチョイ d31b-QjBH)
2021/09/25(土) 16:37:10.46ID:g8iabg1P0 >>673
出典出してくださってありがとうございます
declarator内かtype specifier内かどっちかで現れたかにも関わらず識別子には同じような規則が適用されるのですね
この知見を趣味のコンパイラづくりに役立てたいと思います
ありがとうございました
出典出してくださってありがとうございます
declarator内かtype specifier内かどっちかで現れたかにも関わらず識別子には同じような規則が適用されるのですね
この知見を趣味のコンパイラづくりに役立てたいと思います
ありがとうございました
677デフォルトの名無しさん (エムゾネ FF1f-jOtc)
2021/10/04(月) 14:36:02.21ID:ly3pkK+7F int a = -4 % 3; // -1
int b = -3 % 3; // 0
int c = -2 % 3; // -2
int d = -1 % 3; // -1
int e = (-4) % 3; // -1
int f = (-3) % 3; // 0
int g = (-2) % 3; // -2
int h = (-1) % 3; // -1
これは仕様ですか?環境依存ですか?
int b = -3 % 3; // 0
int c = -2 % 3; // -2
int d = -1 % 3; // -1
int e = (-4) % 3; // -1
int f = (-3) % 3; // 0
int g = (-2) % 3; // -2
int h = (-1) % 3; // -1
これは仕様ですか?環境依存ですか?
678デフォルトの名無しさん (ワッチョイ ff69-Uy5C)
2021/10/04(月) 14:53:49.95ID:DbNnxaRn0 C90は実装による
C99は被除数と同じ符号 ((ISO/IEC 9899:1999) の 6.5.5 見ろ)ってwiki に書いてあったけど
6節の (a/b) * b + a % b === a と
整数化に際しての丸めの方向から結果的にそう解釈すればいいってことなのかな
C99は被除数と同じ符号 ((ISO/IEC 9899:1999) の 6.5.5 見ろ)ってwiki に書いてあったけど
6節の (a/b) * b + a % b === a と
整数化に際しての丸めの方向から結果的にそう解釈すればいいってことなのかな
679デフォルトの名無しさん (ワッチョイ 3337-tRNm)
2021/10/06(水) 19:35:08.68ID:7g8s0ol20 まあ環境依存だと割と困ってたので
C99でIntelの実装にあわせただけなんですけどね
C99でIntelの実装にあわせただけなんですけどね
680はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 533e-M2B7)
2021/10/07(木) 15:44:53.27ID:UkaMQ5gY0681デフォルトの名無しさん (スップ Sdea-N/QG)
2021/10/12(火) 19:07:27.42ID:4loHRlApd 配列から数個おきに取得するとき、なにかアルゴリズムとかライブラリ関数みたいなものってありませんか?
↓みたいなコードです。nが大きく、物凄い時間掛かっていて...
for(i=0; i<n; i++) a[i] = b[i*3];
↓みたいなコードです。nが大きく、物凄い時間掛かっていて...
for(i=0; i<n; i++) a[i] = b[i*3];
682デフォルトの名無しさん (ワッチョイ 5ebb-dT87)
2021/10/12(火) 19:16:28.78ID:bbG44xQB0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 【速報】気象庁は津波注意報すべて解除 [蚤の市★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- ヨッシー、ヘイホー、テレサ ←こいつらwwwwwwwww
- 【悲報】高市早苗の擬人化がXで大バズりwwwwwwwwwwww [455031798]
- さかまた「過呼吸になった」かなた「耳聞こえない」ござる「声出ない」まつり「ご飯食べれない」
- くそしてかがやけ
- 一人暮らしだからケツ出してみてるけど
