- 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 [転載禁止]©2ch.net
47 :デフォルトの名無しさん[sage]:2015/12/04(金) 01:46:15.44 ID:ezzwHQH9 - >>45
そのメッセージの何がわからないの?
|
- C++相談室 part120 [転載禁止]©2ch.net
978 :デフォルトの名無しさん[sage]:2015/12/04(金) 02:19:45.74 ID:ezzwHQH9 - >>958
テンプレート(やクラスやインライン関数など)の定義は、実用上ヘッダに書いて複数の翻訳単位で 定義しないといけないので、定義の重複を認めている。 (字句的に同一であることを含めていくつかの常識的な制約はある。) そういった特例に含まれないものの定義をヘッダに書くと複数の翻訳単位に定義が含まれ、 定義が重複することになる。 ODR(One Definition Rule) 違反ってやつで、結果は未定義。 一般的な実装ではリンクエラーとして検出される。 この特例に含まれるという点ではテンプレートとinline関数は同様だけど、関数テンプレートが 自動的にinlineとみなされるわけじゃない。 ODR はプログラム全体に「定義」がいくつ含まれるか、という話。 「実体」とか言ってるとテンプレートインスタンスとごっちゃになったりするのでやめといたほうがいい。
|
- 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 [転載禁止]©2ch.net
54 :デフォルトの名無しさん[sage]:2015/12/04(金) 09:44:49.42 ID:ezzwHQH9 - >>48
char32_t に直接対応する書式指定は定義されていない。 C なら int_least32_t の typedef ってことになってるから PRIdLEAST32 でいけるんだろうけど、エラーメッセージを 見る限りは C++ っぽいな。 C との移植性を考慮してる処理系なら C++ でも PRIdLEAST32 でいけるかもしれない。 普通に考えれば確実に 32 ビットある unsigned long あたりにキャストして %08lX で表示 すれば移植性含めて確実なんだろうけど、それがダメってことなら・・・ unsigned long x = unko をはさむんならいいの? %p で HANDLE が表示できるのは、たまたま typedef の定義が void* か、ポインタの 表現形式が同じなだけ。移植性は無い。 size_t のフォーマットは C99 でようやく %zu が定義されてる。 C99 未対応の環境を含めて 移植性を持たせようと思ったら、やっぱりキャストすることになるんだろうな。
|