C++相談室 part154

■ このスレッドは過去ログ倉庫に格納されています
2021/01/08(金) 17:54:00.55ID:0DW9z0rL
※前スレ
C++相談室 part153
https://mevius.5ch.net/test/read.cgi/tech/1602339500/

テンプレここまで
283デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:10:21.66ID:5pIDnM+S
>>259
COMサーバーというかDX用にフィルタ書いてると訳判らなくなった
284デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:56:37.48ID:RxAp4EkX
>>281
3値のbooleanを作って何するの?
boolへのポインタにしてtrue / false / nullptr の3値でなんとかならんか?
2021/01/29(金) 17:20:59.69ID:ADFs+h5F
boostにtriboolってのがあるな
2021/01/29(金) 17:23:22.91ID:t7wU8l8M
>>281
仮に真偽値型を継承可能であったとして、三値型が真偽値型を継承するのはおかしいだろう。
場合によって柔軟な判断が必要な場合はあるものの、
継承は is-a 関係を表したいときに限ったほうがよろしいというのが一般的な設計原則だと思うが。
2021/01/29(金) 17:25:47.23ID:GtDK4kd8
nullableか、DBのフィールド値?
2021/01/29(金) 18:57:54.24ID:ZIYbfTXe
はちみつ餃子「スタックトレースできないならデバッガ当てればいいじゃない」
2021/01/29(金) 19:41:08.91ID:rAmh2V0K
典型的な円楕円問題だな
2021/01/29(金) 19:56:26.71ID:ZIYbfTXe
テンプレートを使えば、クラス継承に依存しない記述が可能。
iostreamが黒歴史扱いである現実を踏まえての話。
2021/01/29(金) 21:24:08.77ID:WFMo+mcm
とりあえずiostream批判しとけば訳知り顔ができた気に浸れる浅はかなやつ
2021/01/29(金) 21:35:39.96ID:nnAlz0gZ
c++ニワカあるあるだよなw
iostreamとりあえず批判奴w
2021/01/29(金) 21:39:11.47ID:ZIYbfTXe
iostreamは使いもしないメンバ変数を継承することを強要される悪い手本でしょ。
2021/01/29(金) 22:16:38.63ID:WFMo+mcm
何も説得力を示さずに突然「悪い」と言い出す
2021/01/30(土) 01:56:51.26ID:SJAC6oP5
iostreamはクソなのは正解だが別に批判するようなことでもない
なぜなら使わなければいいだけの話だからだ
2021/01/30(土) 02:06:50.03ID:OHt9F1SU
無理にクラス継承を使わずオーバーライド関数とそれを使うテンプレート関数を充実させたほうが幸せになれる。
2021/01/30(土) 02:41:04.49ID:PJvUkb6d
別に無理して継承を使っているわけではない
どっかの馬の骨が気に入らんからといって
あれを使うなこれを使うなと言われるほうが無理そのものだ
2021/01/30(土) 02:53:37.72ID:OHt9F1SU
例えば、ファイルに書き込む処理があったとする。
ファイルハンドルとして有名な型としては、int型、FILE*型、iostream型、Win32APIのHANDLE型などがあげられる。
これらを派生クラスに閉じ込めて抽象化するよりも、関数名が同じになるオーバーライド関数を作ってテンプレート関数から呼んだ方がはるかに楽。

int WriteBuffer(int fp, const char* buffer);
int WriteBuffer(FILE* fp, const char* buffer);
int WriteBuffer(ostream& fp, const char* buffer);
int WriteBuffer(HANDLE fp, const char* buffer);

template<typename FILE_OBJECT>
void WriteContent(FILE_OBJECT o)
{
WriteBuffer(o, "write test1");
WriteBuffer(o, "write test2");
}
2021/01/30(土) 03:53:39.52ID:ULcRPxme
ドヤってるところすまんがそれオーバーライドじゃない
2021/01/30(土) 04:01:05.04ID:PJvUkb6d
プゲラ
301デフォルトの名無しさん
垢版 |
2021/01/30(土) 05:45:11.84ID:SLqQC90z
フリー関数とクラスメンバでは、インテリセンスが効くか効かないかの違いもある。
2021/01/30(土) 05:52:17.44ID:OHt9F1SU
そんなあなたに名前空間
303デフォルトの名無しさん
垢版 |
2021/01/30(土) 06:06:53.60ID:SLqQC90z
クラスの場合、名前空間を書かなくても、インテリセンスが効く。
2021/01/30(土) 06:47:43.00ID:budoESfZ
コンストラクタの初期化リストで
class A{
 int x;

public:
 A(int x) : x(x) {}
};
みたいにしたとき、ちゃんとメンバのxがコンストラクタの引数のxで初期化されますよね?
メンバの x と同名の引数の x が同一のスコープに同居しているようで紛らわしいかなと思ったのですが、こういう書き方を避ける慣習はありますか
2021/01/30(土) 07:04:07.72ID:ULcRPxme
自分は普通にその書き方してる
避ける人も居るっぽいけど好きなようにすればいい
2021/01/30(土) 09:09:49.20ID:PHKUCpSE
iostreamマンセーバカってのは型安全ならどんな仕様でも良いと思ってるカスが多いからな。
型安全は評価する一項目に過ぎないってのに。
2021/01/30(土) 09:29:38.23ID:vDjChjwr
iostreamは整形のための情報をわざわざ状態として持たされるのがクソ
当時は状態が邪悪だっていう考え方が一般的じゃなかったからしょうがないけど
2021/01/30(土) 09:38:20.91ID:2pTx0la6
でも状態もってなかったら記述が煩雑になりすぎない?
HTMLのマークアップとまでは言わんまでも
2021/01/30(土) 09:59:20.80ID:OHt9F1SU
整形設定を記憶する変数インスタンスをiostreamインスタンスと分離すべきって話でしょ。
必要に応じて差し替えできるように参照渡しするか、逆にiostreamを参照渡しするとか色々やれたはず。
2021/01/30(土) 10:06:40.70ID:OHt9F1SU
というか他のオブジェクト指向言語だと整形情報がFormatterクラスとかに分離されているのが普通だし。
2021/01/30(土) 10:32:05.24ID:PJvUkb6d
FORTRANのFORMAT文が好きな人をどうこうしようとは思わない
2021/01/30(土) 10:40:52.47ID:hVJYorL3
初歩的な質問なのですが、stringクラスの内部バッファはデストラクタで破棄されるため自分では一切管理しなくていいという認識で良いのでしょうか?
313デフォルトの名無しさん
垢版 |
2021/01/30(土) 11:17:24.76ID:SLqQC90z
アロケータによるけど、普通は管理しなくて良いのでは?
314デフォルトの名無しさん
垢版 |
2021/01/30(土) 12:47:13.80ID:EWZvTk3z
>>308
状態持ってても無駄に煩雑(複雑ではない)
2021/01/30(土) 12:57:10.51ID:8FYOnD7D
iostream 型安全なのはいいけど、char/signed char/unsigned char ぜんぶ文字扱いするのはやめて欲しかった。
316デフォルトの名無しさん
垢版 |
2021/01/30(土) 13:18:35.30ID:SLqQC90z
単項プラスで。
2021/01/30(土) 13:18:38.04ID:4OMKN/Z4
>>309
入出力を直接的に司るバッファクラス (basic_streambuf) と
書式制御を司るストリームクラスを分離したデザインになっているし、
必要に応じて差し替えることも出来るよ。

iostream においてそれがわかりやすいか、良いデザインであるかは別として、
ちゃんと分離したデザインになってる。
2021/01/30(土) 14:53:52.50ID:L1O2TNoD
>>304
私は馬鹿なのでメンバ変数とコンストラクタ引数を x, _x というふうに書き分けています、馬鹿が感染るかもしれないのでお勧めはしません
2021/01/30(土) 15:08:20.24ID:S5wIZr5N
C++でのメンバ変数は、標準的には m_xと書く。
2021/01/30(土) 16:04:40.96ID:0ahE8ZR3
>>319
何処信者だよ
ダッサw
321デフォルトの名無しさん
垢版 |
2021/01/30(土) 16:41:05.48ID:SLqQC90z
MicrosoftとAdobeがその書き方多いですね。
2021/01/30(土) 17:13:12.28ID:S5wIZr5N
なお、_x は、命名規約上、禁止。先頭が _ の名前はコンパイラなどの
システム予約なため。
2021/01/30(土) 17:14:26.98ID:2r/QlSUC
そうだったっけ?
2021/01/30(土) 17:19:55.79ID:4OMKN/Z4
>>304
>>318-319
命名規約の方法論は色々なのでプレフィクスを付けるルールが定めてある場合もあるし、
むしろ一致させていくようにしているものもある。
私自身は、少なくともメンバに値を設定するだけの単純なコンストラクタである場合には
名前を一致させていくスタイルで書く。

C++ を使う上でのガイドラインとしてよく参照されているのはグーグルのスタイルガイドで、
データメンバの名前は最後にアンダースコアを付けるようにルールを定めている。
https://google.github.io/styleguide/cppguide.html#Variable_Names

その一方では C++ の設計者である Stroustrup は型やスコープを変数名に含めるのは好ましくない
(しかし部分的に便利な場合もあることは認めている) と書いている。
https://stroustrup.com/bs_faq2.html#Hungarian

どちらの習慣が圧倒的優勢ということはないと思う。

>>322
グローバル変数としてはアンダースコアで始まる名前は予約されているけど、
そうでない場合には問題ない。

ただし、

・ アンダースコアで始まって大文字が続く名前
・ アンダースコアが連続 (名前の先頭部分以外でも) する名前

は名前の種類やスコープにかかわらずどこでも予約されている。
2021/01/30(土) 17:30:01.20ID:2r/QlSUC
互いの信仰を侵害してはならないがチーム内では統一されている必要がある
規約の背景は明確である必要がある
326デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:08:50.99ID:OHt9F1SU
>>317
まず、FILE*とostreamが一対一対応していないのがダメ。
せっかくC言語でファイル、パイプ、標準IOがFILE*型としてで統合化・抽象化されていたのに、
C++でostreamとfstreamで分離される劣化が起きた。
2021/01/30(土) 18:30:25.89ID:PJvUkb6d
ios_baseで統一する形に変わっただけ
それをFILE*がどうたらと駄々こねるのは
頭が堅すぎる実年齢に無関係の老害だ
328デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:36:35.02ID:OHt9F1SU
パイプ処理をostream系で書く奇特な人ってどのくらいいるの?
329デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:41:09.24ID:OHt9F1SU
pythonは定数がないから全部大文字の変数は定数のようにみなしましょう的な談合がある。
2021/01/30(土) 19:00:34.72ID:0ahE8ZR3
定数というか型もない
2021/01/30(土) 19:09:23.04ID:L1O2TNoD
>>322
束縛領域が狭いローカル変数とかには、_x を使ってもいいのではないか?と考えていますが‥‥
2021/01/30(土) 20:32:34.21ID:PJvUkb6d
data_
size_
2021/01/31(日) 03:18:57.87ID:6QCY/vGM
>>331
実は#defineマクロの中で使われるケースがあってね。
_xが、アプリの中で使われてない事を前提にしないとマクロが作れない
場合とか。
334デフォルトの名無しさん
垢版 |
2021/01/31(日) 06:52:18.40ID:gXTMTlGe
HTTPサーバーのサンプルで、関数型言語がCを凌駕して、C実装の作者が??になってるやり取りをどこかで見たのですが、わかる方いらっしゃいませんか?

おそらくC++は簡単に勝てるはずなんですが。
2021/01/31(日) 07:27:56.74ID:fCVb5Gn/
dmrが?
2021/01/31(日) 09:14:46.77ID:bSEeGU13
>>333
c++実装者がユーザから参照可能な形でそれやってるの見たことあるの?
2021/01/31(日) 09:22:03.74ID:fCVb5Gn/
>>333
#define A(_x) (std::cout << #_x)

int main()
{
int _x = 5;
A(_x);
std::cout << _x;
}
何か問題でも?
338デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:19:42.43ID:BqL9JwJS
ひどいな
https://qiita.com/threecups/items/75a4b9ca1298270c5c62
339デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:23:16.43ID:BqL9JwJS
>>331
_で始めると激しくコンパイラ依存になる
340デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:50:22.50ID:BqL9JwJS
>>334
Erlang?
2021/01/31(日) 10:57:57.30ID:+XHxoAeu
>>339
繰り返すが言語仕様上はグローバル変数ではない名前の頭がアンダースコアで始まるだけなら問題ない。

現実に出来が悪いコンパイラがたくさんあるのであれば仕方がないが、
少なくとも俺はそんなのに遭遇したことはない。
2021/01/31(日) 11:04:21.78ID:fCVb5Gn/
>>338
DLLのビルドに使ったコンパイラと
そのDLLを使うアプリをビルドするコンパイラが違っても動くんだぞ
ABIの指定は仕方ねえだろ
2021/01/31(日) 11:29:10.73ID:2WBeknRq
>>334
これか?
サーバーじゃなくてパーサー部分だけだけど
https://blog.8arrow.org/entry/2014/10/23/063044
344デフォルトの名無しさん
垢版 |
2021/01/31(日) 12:10:02.04ID:gXTMTlGe
>>343
それです。
ありがとうございます。
2021/01/31(日) 13:12:26.22ID:ZnRwde8F
>>341
英語サイトでも、説明の仕方が誤解を招くようなものがありまして、もしかしたらそれは誤解かも知れません。
https://stackoverflow.com/questions/25090635/use-and-in-c-programs
「Here's what the C standard says (section 7.1.3):
 1. All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
 2. All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」
訳:
1. アンダースコアで始まって直後に英大文字が続くか、または、アンダースコアが連続して
 続く識別子は、いかなる使用も予約されている。

2. アンダースコアで始まる全ての識別子は、通常または、タグ名前空間における
 ファイルスコープの識別子として常に予約されている。

1. の方は、_XXX か、__xxx は予約されていると言うことですが、
2. の方は、_xxx の形式は、例え xxx の部分の先頭が小文字であっても、ファイルスコープにおける
識別子として予約されており、ローカル変数名としては使うべきではないということだと思われます。

また、C++の方では、
https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
*Reserved in any scope, including for use as implementation macros:
10. identifiers beginning with an underscore followed immediately by an uppercase letter
11. identifiers containing adjacent underscores (or "double underscore")
*Reserved in the global namespace:
12. identifiers beginning with an underscore

この12.の書き方が(あなたに)誤解を招いた気がします。
また、11.によれば、xxx__yyy のように _ が連続するものは、識別子の中間であっても予約されている
とのことです。
2021/01/31(日) 13:18:09.37ID:ZnRwde8F
>>337
それは問題ではないんだけど、
#define a(x) { int _x = 1; _x = x * 2; printf("%d",_x);}
のようなマクロが有ったとすれば、
int y = 5;
a(y); // 10 と表示される。

int _x = 5;
a(_x); // 2 と表示される。
2021/01/31(日) 13:42:32.29ID:Rr91L/mp
int と自作クラス A の pair を priority_queue に入れようと思ったら pair<int, A> に対する less の定義(?)が要るって言われました
int だけに基づいてソートしてくれたら結構なんですが、最も簡単な書き方はどんなですか

また、自作クラス A は array を継承しているのですが、less の定義も引き継ぐ方法はないのでしょうか
2021/01/31(日) 14:05:10.94ID:WjHCKOmN
いろんな見解があってややこしいから、安全側に倒して「_で始まる名前は一切使うな」でいいと思ってる
コンパイラ実装するような奴以外はそれで困らんやろ
349デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:10:22.05ID:gXTMTlGe
【HOW】予約済みの席に座る方法【TO】
2021/01/31(日) 14:15:41.43ID:WjHCKOmN
>>347
using Aitem = std::pair<int, A>;
using Aqueue = std::priority_queue<Aitem>, std::vector<Aitem>, [](const Aitem& lhs, const Aitem& rhs){ return lhs.first < rhs.first; }>
Aqueue your_queue;
2021/01/31(日) 14:54:17.91ID:bSEeGU13
>>345
ファイルスコープとローカルスコープは違うよ。
あと、今議論中なのはアンダースコアひとつで始まるメンバ変数についてなんで、アンダースコアの連続がアウトなのは誰でも知ってるし、餃子も324で書いてる
352デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:06:11.72ID:gXTMTlGe
盛 り 上 が っ て ま い り ま し た ↑
353デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:07:16.87ID:gXTMTlGe
SRELLって知ってますか?
2021/01/31(日) 15:15:54.45ID:ZnRwde8F
>>351
undersocre で始まる識別子は、Cの仕様ではこうなっています:
「All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」

「undersocre で始まる識別子はfile scopeでは使用してはいけない」
とは言っておらず。
「undersocre で始まる識別子はfile scopeの識別子として使用される
ことが予約されている」
と言っています。

with file scope

の前置詞がなぜ in ではなく with になっているかは私には分かりかねますが、
その直後にも in が使われているので in が二重に使われるのを避けたのかも
知れません。
355デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:18:08.68ID:gXTMTlGe
inを踏むとか言ってみたくなるじゃないか。
責任とれ。
2021/01/31(日) 15:18:17.21ID:ZnRwde8F
どうやら、
「identifiers with file scope」は、「ファイルスコープを持つ識別子」
であり、with は、「持つ」の意味で使われているようです、。
2021/01/31(日) 15:41:47.21ID:bSEeGU13
>>354
予約されてるとはつまり使うなってことだけど、いずれにせよファイルスコープの話であって、ローカル変数の話じゃないよ。
2021/01/31(日) 16:03:58.33ID:fCVb5Gn/
>>346
#define a(x) { int z = 1; z = x * 2; printf("%d",z);}
int y = 5; a(y);
int z = 5; a(z);
これと何が違うの?
下線で始まることとは無関係だろ
2021/01/31(日) 16:08:45.08ID:q0ry4PhJ
STLコンテナの継承ってしない方が良いんですかね?

たとえばarrayに機能を追加 ([i][j] で i 行 j 列の要素を取得する等) して行列クラスを作りたいとき、
・arrayを継承する
・行列クラス内で要素を格納するメンバを array として持つ
の2パターンが考えられますが、皆さん的にはどっちが好ましいですか?

行列 is an array なので今こそ継承の使いどころだと思ったのですがいかがでしょうか
2021/01/31(日) 16:16:47.40ID:WjHCKOmN
arrayは仮想デストラクタ持ってないからポリモは出来ない
データ構造使うだけなら必要ない
やめとけ
2021/01/31(日) 16:20:57.91ID:NgKJGEE4
かか関数型マクロなら不用意に定義されていても
 int y = (a)(x)
という書き方おすれば問題無くマクロじゃない関数a()の方が呼ばれるので問題無い!
事前に
 typedef double a;
とかされていた場合は知らんが、
2021/01/31(日) 16:21:36.60ID:2wqasnUt
好きにしたら?
C++なんて自己流全開で俺スゲーしてなんぼ、他人の顔色伺ってたらダメ
行列なんてプロダクションではどうせ出来合いのライブラリ使うんだし
2021/01/31(日) 16:22:25.80ID:q0ry4PhJ
>>360
じゃあメンバとして要素(array)を持てば良いってことですよね?
[]の定義の仕方はわかるのですが、[][]ってどうやって定義するんでしたっけ?
2021/01/31(日) 16:27:00.30ID:+XHxoAeu
>>363
直接には出来ない。 (二引数を受け取れるようにしようという提案はある。)
operator[] を持つ別のクラス (のオブジェクト) を返すという形で実装する。
365デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:27:38.50ID:X7lGC0go
case by case だろうけど
Array と Matrix に関してなら
直観的に考えると後者かな
継承する意味が無い
366デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:30:29.11ID:X7lGC0go
[][][]だと3引数になるの?
[][][][]だと4引数になるの?
って疑問が出るので
operator[] を持つ自分自身のクラス (のオブジェクト)が正解だと思う
2021/01/31(日) 16:31:13.60ID:NgKJGEE4
std::array<std::vector<double> > x;
みたいな
2021/01/31(日) 16:32:01.22ID:NgKJGEE4
ジャグ配列になってしまう…orz
2021/01/31(日) 16:32:06.68ID:fCVb5Gn/
継承といえば
type_infoは仮想デストラクタ持ってるけど
派生クラス作ったやついる? 実験でなく
2021/01/31(日) 16:34:24.04ID:ZnRwde8F
>>358
命名規約に従って変数名をつけていれば、>>346のマクロはバグらない。
一方、>>358のマクロは、命名規約に従って合法的に定義されたローカル
変数zに対して使ってもバグる。
その違い。
2021/01/31(日) 16:34:43.94ID:+XHxoAeu
>>366
operator{] にこだわらずに要素にアクセスするメンバ関数を用意するのでもそんなに困らない。
見栄えだけの問題。

まあ見栄えも大事なんだけど。
2021/01/31(日) 16:36:28.41ID:ZnRwde8F
>>357
そうではなく、_xxx は、グローバル変数で使うことが予約されているので、
ローカル変数では使ってはならない、と読み取れるように思う。
2021/01/31(日) 16:38:11.57ID:q0ry4PhJ
>>366
すみません。どう書いたら良いのか分かりません
[]は
int& operator [] (int i) {return elem[i];}
みたいな感じですよね?
2021/01/31(日) 16:43:15.04ID:fCVb5Gn/
>>370
そのためにinlineとconstexprが用意されてるわけだが
なぜマクロで作らなければならないんだ?

どこぞのOS屋がmaxなんてクソマクロ作ってたせいで
みんな迷惑してたよな
2021/01/31(日) 16:45:04.61ID:+XHxoAeu
>>372
ファイルスコープで予約されている名前とローカル変数で名前がかぶっても
単にシャドウされるだけなので衝突しない。

ローカル変数名として使うべきでないという理由にならない。
2021/01/31(日) 16:51:19.01ID:ZnRwde8F
>>370
[補足]
マクロ引数が二重に評価されてしまうのを防ぐため、マクロ作者が
気を利かせたつもりで次のようなマクロを書いたとする:
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
作者の意図としては、
char *ptr1, *ptr2;
b(*ptr1++, *ptr2++);
のような場合にも正しく動作するようにしたいということで、
この場合は、*ptr1++, *ptr2++ は、それぞれ1回ずつ評価されるので、
ptr1, ptr2 は、それぞれ 1ずつ前に進むので、アプリ作者の意図を
組むことが出来る。

一方、使う側が命名規約に従わず、アプリのローカル変数で_x,_yを定義し、
int _x=1;
int _y=2;
b(_y,_x);
とすると、このマクロは誤動作し、
int x=1;
int y=2;
b(y,x);
と書いたときと結果が変わってくる。
2021/01/31(日) 16:55:15.98ID:wwbd/Qx2
こういうクソしょーもない話って馬鹿でも理解できるから盛り上がるよね
378デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:57:55.61ID:ZnRwde8F
>>375
まあ、そうなんだけども、多分、英語の意味をそのまま素直に汲み取れば、
単純に>>372の意味のはず。
またそれは>>376のような状況を防ぐことが出来る。

>>374
まあ実際それはそういうこともあることは有るが、マクロでしか書けないような
例もあるわけで、>>376のようなマクロ作者のせっかくの配慮が、命名規約
を破って書かれたアプリでは逆効果になってしまうことがある。
2021/01/31(日) 17:00:34.53ID:ZnRwde8F
[補足]
なお、Cの伝統だと、
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
ではなく、
#define b(x,y) do {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } while(0)
と書く。
こうしておくと、このマクロを{}ブロックを伴わないif文に書いたときに異常動作
をしない。
2021/01/31(日) 17:08:36.84ID:+XHxoAeu
>>378
素直に読めばグローバルスコープで予約されているものは
グローバルスコープで予約されているという意外の意味を読み取ることは出来ない。

そこからローカル変数も制約されるという主張が出てくる理由が不在なんで、
何を言うてんのやろ……? ってなるわけ。
2021/01/31(日) 17:11:34.77ID:ziXVeJXQ
>>350
in instantiation of function template specialization ... requested here
というエラーが出ます
2021/01/31(日) 17:14:33.59ID:fCVb5Gn/
>>376
だから二重評価が問題になるようなことをマクロでやるなって
その例だってinlineで書けるだろ

邪道なやり方を保護するために
本筋が迷惑を被るのは本末転倒だ
2021/01/31(日) 17:15:05.39ID:ZnRwde8F
>>380
「All identifiers that begin with an underscore are always reserved
 for use as identifiers with file scope in both the ordinary and
 tag name spaces.」
「file scopeを持つ識別子として使用されるために予約されている」
だべ?
block scopeを持つ識別子として使用されたら、話がおかしいと思うが。

「この自動車は、仕事で使うために予約されています」
の場合、その自動車を私用で使えば、規則違反だよね。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況