前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
探検
C++相談室 part158
■ このスレッドは過去ログ倉庫に格納されています
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
724デフォルトの名無しさん
2022/01/23(日) 20:25:06.27ID:QgynSmAQ > main.cpp (
@echo void sub1^(^);
@echo void sub2^(^);
@echo int main^(^) {
@echo sub1^(^);
@echo sub2^(^);
@echo return 0;
@echo }
)
> sub1.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub1^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sub2.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub2^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sample.mak (
@echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive-
@echo .cpp.obj:
@echo $^(CXX^) $^(CXXFLAGS^) /c $^<
@echo sample.exe: main.obj sub1.obj sub2.obj
@echo link /OUT:$@ $^*^*
)
nmake /f sample.mak
rem バッチファイルもnmakeもよく知りません。
@echo void sub1^(^);
@echo void sub2^(^);
@echo int main^(^) {
@echo sub1^(^);
@echo sub2^(^);
@echo return 0;
@echo }
)
> sub1.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub1^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sub2.cpp (
@echo #include^<iostream^>
@echo struct A { static inline struct { int value; } Field1; };
@echo void sub2^(^) {
@echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl;
@echo }
)
> sample.mak (
@echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive-
@echo .cpp.obj:
@echo $^(CXX^) $^(CXXFLAGS^) /c $^<
@echo sample.exe: main.obj sub1.obj sub2.obj
@echo link /OUT:$@ $^*^*
)
nmake /f sample.mak
rem バッチファイルもnmakeもよく知りません。
725デフォルトの名無しさん
2022/01/23(日) 20:34:19.55ID:K/S7vg9Z >>721 ソース3つ以上もできるよ。 https://wandbox.org/permlink/UgIc9mFrs59059jq
726デフォルトの名無しさん
2022/01/23(日) 20:40:05.18ID:QgynSmAQ >>723
そういうのはプロジェクトの方針だと思うので、ここで話す内容ではないと思うよ
そういうのはプロジェクトの方針だと思うので、ここで話す内容ではないと思うよ
727デフォルトの名無しさん
2022/01/23(日) 20:45:20.80ID:QgynSmAQ >>725
改行と空白で違うのかよw b烽、知るかってャ激xルだけど、bりがと
bニりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ
改行と空白で違うのかよw b烽、知るかってャ激xルだけど、bりがと
bニりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ
728デフォルトの名無しさん
2022/01/23(日) 20:49:22.51ID:QgynSmAQ >>723
>>727は何故だか文字が化けてたので一応書き直しとく。
改行と空白で違うのかよw もう知るかってレベルだけど、ありがと
とりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ
>>727は何故だか文字が化けてたので一応書き直しとく。
改行と空白で違うのかよw もう知るかってレベルだけど、ありがと
とりあえず>>710を載っけとく
https://wandbox.org/permlink/e8khwggKe00rtekJ
729デフォルトの名無しさん
2022/01/24(月) 19:27:55.24ID:WxnVLAIm C++11から、C++20までの変更点を解説した入門書を年末に買ったのだが(C++は書けるよ)、まだ読む気になれないw
「今更C++か、pythonでいいだろ」と悪魔が囁くw
「今更C++か、pythonでいいだろ」と悪魔が囁くw
730デフォルトの名無しさん
2022/01/24(月) 19:42:15.63ID:nLfFXIoN c++cliについてネットに解説している情報あまり無いですが、まとまってるサイトとかないですかね。
731デフォルトの名無しさん
2022/01/24(月) 20:29:40.39ID:kghIRcG8732デフォルトの名無しさん
2022/01/25(火) 08:07:34.25ID:m+e4/QVD めずらしい
変態に興味あるとは
VisualJ++とかワケワカだったぜw
変態に興味あるとは
VisualJ++とかワケワカだったぜw
733デフォルトの名無しさん
2022/01/26(水) 05:15:43.56ID:DGJ/MazB 1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_CREATE:
SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義
break;
case WM_TIMER: //タイマー
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
tmDraw(hdc); //これを呼んで描画
EndPaint(hWnd, &ps);
}
break;
return 0;
}
static VOID tmDraw(HDC hDC)
{
SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認
SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00));
Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
}
最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。
呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。
windowサイズを手動で変えていくと四角は右に伸びていき更新されます。
タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_CREATE:
SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義
break;
case WM_TIMER: //タイマー
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
tmDraw(hdc); //これを呼んで描画
EndPaint(hWnd, &ps);
}
break;
return 0;
}
static VOID tmDraw(HDC hDC)
{
SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認
SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00));
Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
}
最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。
呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。
windowサイズを手動で変えていくと四角は右に伸びていき更新されます。
タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
734デフォルトの名無しさん
2022/01/26(水) 06:35:00.77ID:R08bxH5q WM_TIMERでBeginPaintはおかしいぞ
WM_PAINT専用なんだから
無効領域ないのにBeginPaintしたらあかん
[誘導] 続きはこっちでな
Win32API質問箱 Build127
https://mevius.5ch.net/test/read.cgi/tech/1639053176/
WM_PAINT専用なんだから
無効領域ないのにBeginPaintしたらあかん
[誘導] 続きはこっちでな
Win32API質問箱 Build127
https://mevius.5ch.net/test/read.cgi/tech/1639053176/
735デフォルトの名無しさん
2022/01/26(水) 07:17:52.16ID:T9eKedNN InvalidateRectとかGetDC〜ReleaseDCだっけ?
736デフォルトの名無しさん
2022/01/26(水) 07:50:18.18ID:td9ayUMw アップデートはマイクロソフトがやりたい時にやる
という基本理念を理解していないようだね
という基本理念を理解していないようだね
737デフォルトの名無しさん
2022/01/26(水) 09:14:18.23ID:m89Xdimf WM_TIMERでInvalidateRectしておくとWindowsがWM_PAINT呼んでくれるからそこで描画するんだっけ
738デフォルトの名無しさん
2022/01/26(水) 09:17:55.57ID:qvNTvCwo そもそもこれCだろ…
WinMainから書く超基礎的コードをここで聞く頭がもうね
WinMainから書く超基礎的コードをここで聞く頭がもうね
739デフォルトの名無しさん
2022/01/26(水) 09:26:13.12ID:WR8doP3S べつにアイドルループで描画してもいいんだよ
メッセージの処理さえ忘れずにピークしてこなせば
メッセージの処理さえ忘れずにピークしてこなせば
740デフォルトの名無しさん
2022/01/26(水) 09:32:54.79ID:g/1zEXcm >>738
スレチなのは確かだが、いちいち見下して何がしたいんだお前
スレチなのは確かだが、いちいち見下して何がしたいんだお前
741デフォルトの名無しさん
2022/01/26(水) 09:36:18.65ID:dkXO6/An どこにでもいるんだよ
自分より下の者をいたぶることで
安心しようとするチンピラ気質なやつは
自分より下の者をいたぶることで
安心しようとするチンピラ気質なやつは
742デフォルトの名無しさん
2022/01/26(水) 10:21:44.17ID:qvNTvCwo だってココ定期的に湧くじゃん
Windows使っててWin32APIの使い方聞いてくるC++ほとんど知らない自称天才のバカ
同じやつだよきっと
毎回Win32APIに誘導されてるってのにな
Windows使っててWin32APIの使い方聞いてくるC++ほとんど知らない自称天才のバカ
同じやつだよきっと
毎回Win32APIに誘導されてるってのにな
743デフォルトの名無しさん
2022/01/26(水) 10:46:25.17ID:g/1zEXcm あー、言われれば確かにそんなの居たっけ・・
でもまぁ同一人物とは限らないんだし誘導して終わりでいんじゃね
たまに見当違いの初心者は入ってくるし(DirectXスレにDirectXランタイムのインスコの仕方聞きにきた猛者が居た
でもまぁ同一人物とは限らないんだし誘導して終わりでいんじゃね
たまに見当違いの初心者は入ってくるし(DirectXスレにDirectXランタイムのインスコの仕方聞きにきた猛者が居た
744デフォルトの名無しさん
2022/01/26(水) 10:59:27.08ID:vhiSf69I 733 すいません、そっちのスレは知りませんでした
そちらで聞き直します
そちらで聞き直します
745デフォルトの名無しさん
2022/01/26(水) 11:06:01.05ID:qvNTvCwo DirectXスレにDirectXランタイムのインスコの仕方聞くのはまだ仕方ない話
ドライバ固有の問題に当たっているなら専門家に聞いた方がいいだろう
自称天才のバカである確率の方が高いと思うし、高確率で単発IDで荒らすバカも同じだろうし、わざわざレスしてくるやつも同じだろうから、バカにはバカと言ってあげた方が親切
ドライバ固有の問題に当たっているなら専門家に聞いた方がいいだろう
自称天才のバカである確率の方が高いと思うし、高確率で単発IDで荒らすバカも同じだろうし、わざわざレスしてくるやつも同じだろうから、バカにはバカと言ってあげた方が親切
746デフォルトの名無しさん
2022/01/26(水) 12:02:29.99ID:dkXO6/An 誘導ももう済んでるのに
どうしても喧嘩言葉を使いたくて沸いてくる
三下のそのまた下の家畜はいいのか
どうしても喧嘩言葉を使いたくて沸いてくる
三下のそのまた下の家畜はいいのか
747デフォルトの名無しさん
2022/01/26(水) 13:23:53.73ID:m89Xdimf DirectXランタイムが許されるならWin32 APIだって許してあげなよ
製品名はVisual C++だし、既定の拡張子 .cpp なんだから Win32はC++ではなくCだって言ってもしょうがない
製品名はVisual C++だし、既定の拡張子 .cpp なんだから Win32はC++ではなくCだって言ってもしょうがない
748デフォルトの名無しさん
2022/01/26(水) 23:06:08.50ID:UuxYD5f6 いかにも漏れは天才だが
さすがにWinMain()から書くようなバリバリWindowsアプリの質問はしないかなあ、、、
漏れの言ってることがまるで理解できない低レヴェル凡人の反発を招くことはあってもな
さすがにWinMain()から書くようなバリバリWindowsアプリの質問はしないかなあ、、、
漏れの言ってることがまるで理解できない低レヴェル凡人の反発を招くことはあってもな
749デフォルトの名無しさん
2022/01/27(木) 10:59:27.25ID:Z+Vqme3O 天才でも質問することあるんですね
回答者は超天才?
回答者は超天才?
750デフォルトの名無しさん
2022/01/27(木) 11:49:44.22ID:avZQ9Wm7 いかにも
私が超天才だが
ってどっかのハンコ貰いにいく人事のCMみたい
私が超天才だが
ってどっかのハンコ貰いにいく人事のCMみたい
751デフォルトの名無しさん
2022/01/29(土) 15:04:46.13ID:mo0R2qbj 大学の課題でコンパイルエラーになるので教えてもらいないでしょうか
main.cppで、B<A> b; b.display(); のようにAを使っています。
g++ -Wall -std=c++17 -g -o test a.cpp main.cpp
undefined reference to `operator<<(ostream&, A const&)'
※コンストラクタなどの関数定義は省略してます。
■ a.h
class A {
public:
string m_str;
friend ostream & operator << (ostream &os, const A &a);
};
■ a.cpp
ostream & operator << (ostream &os, const A &a)
{
os << a.m_str << endl;
return os;
}
■ b.h
template <typename T>
class B
{
public:
void display(ostream &os = cout) const;
T m_dummy;
};
template <typename T>
void B<T>::display(ostream &os) const
{
os << m_dummy << endl; // ここが undefined referenceエラー
}
main.cppで、B<A> b; b.display(); のようにAを使っています。
g++ -Wall -std=c++17 -g -o test a.cpp main.cpp
undefined reference to `operator<<(ostream&, A const&)'
※コンストラクタなどの関数定義は省略してます。
■ a.h
class A {
public:
string m_str;
friend ostream & operator << (ostream &os, const A &a);
};
■ a.cpp
ostream & operator << (ostream &os, const A &a)
{
os << a.m_str << endl;
return os;
}
■ b.h
template <typename T>
class B
{
public:
void display(ostream &os = cout) const;
T m_dummy;
};
template <typename T>
void B<T>::display(ostream &os) const
{
os << m_dummy << endl; // ここが undefined referenceエラー
}
752751
2022/01/29(土) 15:50:41.96ID:mo0R2qbj 失礼、自己解決しました。
namespaceをa.hだけ括って、a.cppに入れ忘れましたw
namespaceをa.hだけ括って、a.cppに入れ忘れましたw
753デフォルトの名無しさん
2022/01/31(月) 02:23:38.98ID:iz74n4+D 下の★1を★2のように書きたいんだけど、どうやって書けばいいのか
教えてぇ
#include <iostream>
template <typename T>
auto Sum(T h)
{
return h;
}
template <typename Head,typename... Rests>
auto Sum(Head head,Rests... rests)
{
return head + Sum(rests...);
}
template<class F,class... Args>
auto
foo(F&& f,Args... args)
{
return f(args...);
}
int main( int argc, char *argv[] )
{
std::cout << foo(Sum<int,int,int>,1,2,3) << "\n";//★1
//std::cout << foo(Sum,1,2,3) << "\n"; //★2
}
教えてぇ
#include <iostream>
template <typename T>
auto Sum(T h)
{
return h;
}
template <typename Head,typename... Rests>
auto Sum(Head head,Rests... rests)
{
return head + Sum(rests...);
}
template<class F,class... Args>
auto
foo(F&& f,Args... args)
{
return f(args...);
}
int main( int argc, char *argv[] )
{
std::cout << foo(Sum<int,int,int>,1,2,3) << "\n";//★1
//std::cout << foo(Sum,1,2,3) << "\n"; //★2
}
755デフォルトの名無しさん
2022/01/31(月) 04:18:19.49ID:o5RGUewZ なんでも適当に済ますクセ
高級言語に慣れすぎの弊害
高級言語に慣れすぎの弊害
756デフォルトの名無しさん
2022/01/31(月) 14:49:02.61ID:y2HjUy1l >>753
・まず、Sumを多重定義にする必要性は特にないはず
・次に、fooが関数でSumが関数テンプレートの場合、
関数の実引数として具現しないテンプレートは渡せない
だからfooの代わりにstd::bindを使っても解決しない
・テンプレートテンプレート仮引数を使っても
クラステンプレートしか渡せず関数テンプレートは不可
こうなるとマクロくらいしか手がない
#define foo(func, ...) func(__VA_ARGS__)
・まず、Sumを多重定義にする必要性は特にないはず
・次に、fooが関数でSumが関数テンプレートの場合、
関数の実引数として具現しないテンプレートは渡せない
だからfooの代わりにstd::bindを使っても解決しない
・テンプレートテンプレート仮引数を使っても
クラステンプレートしか渡せず関数テンプレートは不可
こうなるとマクロくらいしか手がない
#define foo(func, ...) func(__VA_ARGS__)
757デフォルトの名無しさん
2022/01/31(月) 16:24:09.60ID:4mzN2AL1 戻り値のautoが決まらないってことでしょ?autoをdouble固定にしてReturnをなくせば通る
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
int main( int argc, char *argv[] ) {
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
std::cout << wrap(sum, 1,2.1) << std::endl;
return 0;
}
// /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample
// /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’:
// /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’
// 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
// | ^~~~
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed:
// /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
int main( int argc, char *argv[] ) {
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
std::cout << wrap(sum, 1,2.1) << std::endl;
return 0;
}
// /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample
// /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’:
// /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’
// 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
// | ^~~~
// /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed:
// /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’
// 10 | std::cout << wrap(sum, 1,2.1) << std::endl;
// | ^
758デフォルトの名無しさん
2022/01/31(月) 20:55:29.83ID:ExACmeMg >>753
auto Sum = [](auto head, auto... rests) { return (head + ... + rests); };
auto Sum = [](auto head, auto... rests) { return (head + ... + rests); };
759デフォルトの名無しさん
2022/01/31(月) 22:50:37.06ID:67CF9RIT ラッパークラスを通せば似たようなことはできそう。
struct Wrapper_ {
constexpr static auto doit = [](auto... args) { return Sum(args...); };
} wrapper;
int main( int, char ** )
{
std::cout << foo(wrapper.doit,1,2,3) << "\n";
}
struct Wrapper_ {
constexpr static auto doit = [](auto... args) { return Sum(args...); };
} wrapper;
int main( int, char ** )
{
std::cout << foo(wrapper.doit,1,2,3) << "\n";
}
760デフォルトの名無しさん
2022/02/01(火) 04:38:50.89ID:X9o0BiPI クラスは不要だった。
ラムダなら通るみたいだから、 >>758 みたいに元の関数をラムダで書くか、
auto wrapper = [](auto... args) { return Sum(args...); };
みたいなラッパー関数オブジェクト通すかってあたりで足りそう。
// 最初実験してたとき、ラムダ式にしただけだとエラー出てた気がしたんだけど、今やると問題なく通る…
ラムダなら通るみたいだから、 >>758 みたいに元の関数をラムダで書くか、
auto wrapper = [](auto... args) { return Sum(args...); };
みたいなラッパー関数オブジェクト通すかってあたりで足りそう。
// 最初実験してたとき、ラムダ式にしただけだとエラー出てた気がしたんだけど、今やると問題なく通る…
761デフォルトの名無しさん
2022/02/01(火) 05:38:09.33ID:wGiSz27Y おお、auto... なんてできたのか
762デフォルトの名無しさん
2022/02/01(火) 07:53:40.48ID:vPA4cgbg >>757にラムダ入れた。
ラムダはオーバーロードできずC++17の畳み込み式が必須で引数なしが表現できないが、選択の手間がない。
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
auto lambda_sum = [](auto head, auto ...tails) {return (head + ... + tails);}; // 追加
auto lambda_wrap = [](auto f, auto ...args) {return f(args...);}; // 追加
int main( int argc, char *argv[] ) {
std::cout << sum() << std::endl; // 追加
std::cout << sum(1) << std::endl; // 追加
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << wrap(sum, 1,2.1) << std::endl; // エラー
// lambda版追加
// std::cout << lambda_sum() << std::endl; // エラー
std::cout << lambda_sum(1) << std::endl; // 追加
std::cout << lambda_sum(1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(lambda_sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << lambda_wrap(lambda_sum<int,double>, 1,2.1) << std::endl; // not template
// std::cout << lambda_wrap(sum, 1,2.1) << std::endl; // エラー
std::cout << lambda_wrap(lambda_sum, 1,2.1) << std::endl;
return 0;
}
ラムダはオーバーロードできずC++17の畳み込み式が必須で引数なしが表現できないが、選択の手間がない。
#include <iostream>
auto sum() {return 0;}
template<typename Head> auto sum(Head head) {return head;}
template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);}
template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);}
auto lambda_sum = [](auto head, auto ...tails) {return (head + ... + tails);}; // 追加
auto lambda_wrap = [](auto f, auto ...args) {return f(args...);}; // 追加
int main( int argc, char *argv[] ) {
std::cout << sum() << std::endl; // 追加
std::cout << sum(1) << std::endl; // 追加
std::cout << sum(1,2.1) << std::endl;
std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << wrap(sum, 1,2.1) << std::endl; // エラー
// lambda版追加
// std::cout << lambda_sum() << std::endl; // エラー
std::cout << lambda_sum(1) << std::endl; // 追加
std::cout << lambda_sum(1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(static_cast<double(*)(int,double)>(lambda_sum), 1,2.1) << std::endl;
std::cout << lambda_wrap(sum<int,double>, 1,2.1) << std::endl;
// std::cout << lambda_wrap(lambda_sum<int,double>, 1,2.1) << std::endl; // not template
// std::cout << lambda_wrap(sum, 1,2.1) << std::endl; // エラー
std::cout << lambda_wrap(lambda_sum, 1,2.1) << std::endl;
return 0;
}
763デフォルトの名無しさん
2022/02/01(火) 22:23:26.64ID:rdLB3H0G c++では
sz=120;
char dt[sz];
このように配列のサイズを変数の可変サイズで指定することはできないんですか?
これを実現する方法は何かありませんか?
sz=120;
char dt[sz];
このように配列のサイズを変数の可変サイズで指定することはできないんですか?
これを実現する方法は何かありませんか?
764デフォルトの名無しさん
2022/02/01(火) 22:43:02.67ID:rdLB3H0G 自己解決しました
しかし dt[10][d] のように2次元以上はjavaのような動的変動はできないんですね
しかし dt[10][d] のように2次元以上はjavaのような動的変動はできないんですね
765デフォルトの名無しさん
2022/02/01(火) 23:27:31.22ID:fhOfpvRh vector使わんの?
766デフォルトの名無しさん
2022/02/01(火) 23:28:28.99ID:hJiWfYJV 配列使わんし
767デフォルトの名無しさん
2022/02/01(火) 23:30:45.06ID:Sh1zYLGa768デフォルトの名無しさん
2022/02/02(水) 10:03:42.12ID:pPu7Tazo コンストラクタ・テンプレートでテンプレート実引数を推定させず明示的に与えるのはどう書く?
struct some_class
{
template <class A> some_class(int) {}
};
int main()
{
some_class obj<void>(1); //error
}
struct some_class
{
template <class A> some_class(int) {}
};
int main()
{
some_class obj<void>(1); //error
}
769デフォルトの名無しさん
2022/02/02(水) 12:11:02.47ID:ryNE78sg >>768
コンストラクタには明示的に型引数を渡せない
コンストラクタには明示的に型引数を渡せない
770デフォルトの名無しさん
2022/02/02(水) 12:36:54.65ID:pPu7Tazo そっか。。。残念
thx >>769
thx >>769
771デフォルトの名無しさん
2022/02/02(水) 12:56:51.10ID:X/91R13x ファイルサイズを取得しようとしていろいろサイトを参考にして次のようにしたのですが
std::filesystem::file_size(path)
filesystemのところに赤線が出て使用できません
これらは記述しています
#include <iostream>
#include <fstream>
#include <filesystem>
使っているのはCommunity 2019です
filesystemが使えないのはなぜでしょう?
std::filesystem::file_size(path)
filesystemのところに赤線が出て使用できません
これらは記述しています
#include <iostream>
#include <fstream>
#include <filesystem>
使っているのはCommunity 2019です
filesystemが使えないのはなぜでしょう?
772デフォルトの名無しさん
2022/02/02(水) 13:02:34.63ID:ryNE78sg773デフォルトの名無しさん
2022/02/02(水) 13:34:32.24ID:pPu7Tazo >>771
/std:c++17は指定してる?
/std:c++17は指定してる?
774デフォルトの名無しさん
2022/02/02(水) 13:43:30.57ID:X/91R13x ありがとうございます C++17指定できました
775デフォルトの名無しさん
2022/02/03(木) 12:49:10.84ID:d1XPVqCl filesystemは、できればC++20モードで使いたい
file_clockまわりがC++17ではgdgdだから
file_clockまわりがC++17ではgdgdだから
776デフォルトの名無しさん
2022/02/04(金) 13:06:35.94ID:ovGR74Kw 小文字に変換するプログラムです
string toLowerCase(const string& str)
{
string lower = str;
std::transform(lower.begin(), lower.end(), lower.begin(), std::tolower);
return lower;
}
実行するとstd::transform 一致するオーバーロードする関数が見つかりません、とか
6引数が必要です 4が設定されてます、とか出て
実行できません
これは何が問題なのでしょうか?
string toLowerCase(const string& str)
{
string lower = str;
std::transform(lower.begin(), lower.end(), lower.begin(), std::tolower);
return lower;
}
実行するとstd::transform 一致するオーバーロードする関数が見つかりません、とか
6引数が必要です 4が設定されてます、とか出て
実行できません
これは何が問題なのでしょうか?
777デフォルトの名無しさん
2022/02/04(金) 13:07:58.25ID:N/NFryku tolowerが多重定義関数だからじゃね?
778デフォルトの名無しさん
2022/02/04(金) 13:22:13.60ID:ovGR74Kw 自分では他に定義してないんですがどこで定義されてるんでしょう
779はちみつ餃子 ◆8X2XSCHEME
2022/02/04(金) 13:28:07.50ID:RpLWwySn >>776
ちょうど >>658 で同じような事例が出ている。
std::tolower は cctype ヘッダと locale ヘッダにそれぞれあって
locale ヘッダのほうが関数テンプレートだし二引数なのでこの場の都合に合わない。
なんらかの方法でどれを使うのか選択する必要があり、
たとえば static_cast などが使える。
ただ、 >>661 が提示しているようにデフォルト引数が追加される可能性があったりもするので
static_cast よりはラムダ式を経由するほうが安心できるスタイルかもね。
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
std::string toLowerCase(const std::string& str)
{
std::string lower;
std::transform(std::begin(str), std::end(str), std::back_inserter(lower), static_cast<int(*)(int)>(std::tolower));
return lower;
}
int main(void) {
std::cout << toLowerCase("abcDEfgHi") << std::endl;
}
ちょうど >>658 で同じような事例が出ている。
std::tolower は cctype ヘッダと locale ヘッダにそれぞれあって
locale ヘッダのほうが関数テンプレートだし二引数なのでこの場の都合に合わない。
なんらかの方法でどれを使うのか選択する必要があり、
たとえば static_cast などが使える。
ただ、 >>661 が提示しているようにデフォルト引数が追加される可能性があったりもするので
static_cast よりはラムダ式を経由するほうが安心できるスタイルかもね。
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
std::string toLowerCase(const std::string& str)
{
std::string lower;
std::transform(std::begin(str), std::end(str), std::back_inserter(lower), static_cast<int(*)(int)>(std::tolower));
return lower;
}
int main(void) {
std::cout << toLowerCase("abcDEfgHi") << std::endl;
}
780デフォルトの名無しさん
2022/02/04(金) 13:35:40.02ID:ovGR74Kw ありがとうございます ビルド通ったみたいです
781デフォルトの名無しさん
2022/02/04(金) 13:55:24.36ID:3M0ClPfa 最近のはptr_funやんなくても通んだな
782デフォルトの名無しさん
2022/02/05(土) 11:50:25.88ID:DOE5sh/+ template<yyy T>//yyyはコンセプト
requires !xxx<T>//xxxはコンセプト
void test(const T& a);//yyyのコンセプトを満たしxxxのコンセプトを満たさないものについて処理したい
C++20のコンセプトのrequires節って!使うと警告出るのでわざわざ否定用のコンセプト作成して対応してるんだけど、もっと簡単な仕組みない?
requires !xxx<T>//xxxはコンセプト
void test(const T& a);//yyyのコンセプトを満たしxxxのコンセプトを満たさないものについて処理したい
C++20のコンセプトのrequires節って!使うと警告出るのでわざわざ否定用のコンセプト作成して対応してるんだけど、もっと簡単な仕組みない?
783デフォルトの名無しさん
2022/02/05(土) 11:52:48.48ID:vpksE3yJ requires (!xxx<T>)
784デフォルトの名無しさん
2022/02/05(土) 12:04:00.17ID:DOE5sh/+ 解決した!ありがとう!
785デフォルトの名無しさん
2022/02/05(土) 20:23:31.04ID:Irrrknzv #define FOO() 1
#if FOO
...
#endif
と書いた場合FOOの後ろに()付けるの忘れてるのでコンパイルエラーになって欲しいんですが
実際はFOOは偽に評価されてるみたいです
何が起きてるんでしょうか?
#if FOO
...
#endif
と書いた場合FOOの後ろに()付けるの忘れてるのでコンパイルエラーになって欲しいんですが
実際はFOOは偽に評価されてるみたいです
何が起きてるんでしょうか?
786はちみつ餃子 ◆8X2XSCHEME
2022/02/05(土) 20:31:08.99ID:NEwj3nV7 >>785
#if の条件の部分ではマクロ展開できるものを全部展開したあとに知らない識別子が残ったら 0 と解釈する。
#if の条件の部分ではマクロ展開できるものを全部展開したあとに知らない識別子が残ったら 0 と解釈する。
787デフォルトの名無しさん
2022/02/05(土) 20:32:57.42ID:BHACckaU >>785
FOO に () が無いことで展開されず、マクロ展開後に残った識別子として 0 に置き換わってる。
https://timsong-cpp.github.io/cppwp/n4868/cpp.cond#11.sentence-1
> After all replacements ..., all remaining identifiers and keywords,
> except for true and false, are replaced with the pp-number 0, ...
FOO に () が無いことで展開されず、マクロ展開後に残った識別子として 0 に置き換わってる。
https://timsong-cpp.github.io/cppwp/n4868/cpp.cond#11.sentence-1
> After all replacements ..., all remaining identifiers and keywords,
> except for true and false, are replaced with the pp-number 0, ...
788デフォルトの名無しさん
2022/02/06(日) 01:29:50.60ID:Yc7Iwiyd >>785
バカですか?
バカですか?
789デフォルトの名無しさん
2022/02/06(日) 01:32:54.82ID:3BxbnhGH #if defined(FOO)
...
#endif
...
#endif
790デフォルトの名無しさん
2022/02/06(日) 01:34:05.59ID:Yc7Iwiyd Cの基本が出来てないくせにC++を使いこなせると思うなよ
791デフォルトの名無しさん
2022/02/06(日) 01:35:00.88ID:H2F64OwB 横からだけど知らなかった
792デフォルトの名無しさん
2022/02/06(日) 03:28:00.08ID:XnD7OQcd793デフォルトの名無しさん
2022/02/06(日) 06:46:34.29ID:qvD4QsX7 こういう馬鹿のためにコンパイラに無駄なルールが必要になるんだなと実感
794デフォルトの名無しさん
2022/02/06(日) 06:55:06.64ID:usxBX4wT エラーにならないのは理不尽だな
795デフォルトの名無しさん
2022/02/06(日) 08:23:12.41ID:qvD4QsX7 馬鹿のためにわざわざプリプロセスで構文解析エラーを要求するとか馬鹿の極み
796デフォルトの名無しさん
2022/02/06(日) 08:30:29.95ID:usxBX4wT FOOが0になる根拠を与えていないだろ
関連付けられていないものが出てくるのがおかしいと思わないとしたらPG適性低いぞ
関連付けられていないものが出てくるのがおかしいと思わないとしたらPG適性低いぞ
797デフォルトの名無しさん
2022/02/06(日) 08:53:46.75ID:2YxKeDPZ 唐突に0がどうとか言い出すのはセンス無いわ
798デフォルトの名無しさん
2022/02/06(日) 09:07:44.45ID:HE5J2RYG 初めて知った
799デフォルトの名無しさん
2022/02/06(日) 09:24:54.74ID:usxBX4wT800デフォルトの名無しさん
2022/02/06(日) 09:35:58.81ID:qvD4QsX7 馬鹿は当たり前のように英語も読めない
801デフォルトの名無しさん
2022/02/06(日) 09:36:22.76ID:vWDceL4H なんじゃそりゃ>>799はC++規格委員会が死ね言うたら死ぬんか、
802デフォルトの名無しさん
2022/02/06(日) 09:57:50.12ID:vWDceL4H 規格書にはなんでそうなっているのか(置換されずに残ったFOOをエラーではなく0にするのか)の理由が書かれていないが
#ifdef defined(FOO) && FOO
として現れる論理式「defined(FOO) && FOO」の解釈を簡単にやりたい(FOOが未定義の場合でも通常の式の解釈ルーチンで処理したい
的なしょーもない理由だったりして……
#ifdef defined(FOO) && FOO
として現れる論理式「defined(FOO) && FOO」の解釈を簡単にやりたい(FOOが未定義の場合でも通常の式の解釈ルーチンで処理したい
的なしょーもない理由だったりして……
803デフォルトの名無しさん
2022/02/06(日) 09:59:13.49ID:vWDceL4H まつがえたorz
×: #ifdef defined(FOO) && FOO
○: #if defined(FOO) && FOO
×: #ifdef defined(FOO) && FOO
○: #if defined(FOO) && FOO
804デフォルトの名無しさん
2022/02/06(日) 10:11:26.46ID:usxBX4wT805デフォルトの名無しさん
2022/02/06(日) 10:16:43.48ID:a0g451d/ 理由はたぶん、規格化以前に存在した実装の動作を規格違反とするのはマズいとか、
その動作に依存して #if FOO としてる既存ソースをエラーとするわけにはいかなかったとか、
そんなところだろうと思う。
マズい動作として検出したければ警告は出せるんだし。
その動作に依存して #if FOO としてる既存ソースをエラーとするわけにはいかなかったとか、
そんなところだろうと思う。
マズい動作として検出したければ警告は出せるんだし。
806デフォルトの名無しさん
2022/02/06(日) 11:57:03.48ID:qvD4QsX7 馬鹿がまだ騒いでるのかw
こういう変なコードとの対比w
$ g++ -x c++ - <<EOF
auto f = [](){return 2;};
#define f() 1
int main() {
auto i = f();
auto j = f;
return i + j();
}
EOF
$ ./a.out
$ echo $?
3
$
こういう変なコードとの対比w
$ g++ -x c++ - <<EOF
auto f = [](){return 2;};
#define f() 1
int main() {
auto i = f();
auto j = f;
return i + j();
}
EOF
$ ./a.out
$ echo $?
3
$
807はちみつ餃子 ◆8X2XSCHEME
2022/02/06(日) 12:12:45.00ID:u7K67HUJ 残った識別子を 0 に解釈する挙動は C89 からの仕様だから C89 の Rationale (根拠) を見たんだけど直接的な言及は見つからない。
https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BxVCLS4f8Sg5NWZmM2NjZWEtYmExMS00Y2EzLWE3ZTMtNzFmYjYwYzBiOTIw&hl=en_US
ただ、既存のコードに差し障りがないようにということは明記してある (3.8.3) ので、
その時点でそういう挙動が支配的 (かつそれに依存するコードが多かった) のだろうとは察せられる。
規格ってのは統一を図るってのが第一の目的だけど無理な仕様でまとめちゃうと誰もその規格に従わないだけなんで、
現実にそれでやっているってのも (たとえ不格好でも) 十分な理由になるんだよ。
https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BxVCLS4f8Sg5NWZmM2NjZWEtYmExMS00Y2EzLWE3ZTMtNzFmYjYwYzBiOTIw&hl=en_US
ただ、既存のコードに差し障りがないようにということは明記してある (3.8.3) ので、
その時点でそういう挙動が支配的 (かつそれに依存するコードが多かった) のだろうとは察せられる。
規格ってのは統一を図るってのが第一の目的だけど無理な仕様でまとめちゃうと誰もその規格に従わないだけなんで、
現実にそれでやっているってのも (たとえ不格好でも) 十分な理由になるんだよ。
808デフォルトの名無しさん
2022/02/06(日) 12:26:28.98ID:qvD4QsX7 そう書かれるとC89っぽく書かないといかんのか?w
変更部分のみw
$ gcc -x c -std=c89 - <<EOF
int f(void){return 2;}
#define f() 1
int main(void) {
int i;
int (*j)();
i = f();
j = &f;
return i + (*j)();
}
EOF
変更部分のみw
$ gcc -x c -std=c89 - <<EOF
int f(void){return 2;}
#define f() 1
int main(void) {
int i;
int (*j)();
i = f();
j = &f;
return i + (*j)();
}
EOF
809デフォルトの名無しさん
2022/02/06(日) 12:53:10.29ID:FF40fIFl CとC++の規格は既存コードへの忖度の塊で出来てるからな
万人の敵だったgets()を削除するのにどんだけ苦労してるのやら
万人の敵だったgets()を削除するのにどんだけ苦労してるのやら
810デフォルトの名無しさん
2022/02/06(日) 13:16:26.39ID:vWDceL4H811デフォルトの名無しさん
2022/02/06(日) 13:22:45.35ID:vWDceL4H >>807
C++規格委員会は無罪なのかもしれんがじゃあなんでC89以前からそうで
そういう挙動が支配的になってしまう事態になってしまったのか、と考えると
やっぱプリプロセッサの最初の設計者がサボって
プリプロセッサ式の途中でのFOOの定義/未定義判定を
define(FOO)を導入する代わりに仕様の方を弄って簡単ハックしてしまったから
のでは……
C++規格委員会は無罪なのかもしれんがじゃあなんでC89以前からそうで
そういう挙動が支配的になってしまう事態になってしまったのか、と考えると
やっぱプリプロセッサの最初の設計者がサボって
プリプロセッサ式の途中でのFOOの定義/未定義判定を
define(FOO)を導入する代わりに仕様の方を弄って簡単ハックしてしまったから
のでは……
812デフォルトの名無しさん
2022/02/06(日) 13:33:49.71ID:qvD4QsX7 コードを示しても馬鹿には伝わらない悲しみw
813デフォルトの名無しさん
2022/02/06(日) 13:37:12.22ID:vWDceL4H >>812
天才にもわかるようにkwsk
天才にもわかるようにkwsk
814デフォルトの名無しさん
2022/02/06(日) 13:39:17.55ID:qvD4QsX7 天才は自力でなんとか出来るし、他人を信用しないことも多いから、基本的に質問とかする機会がない
アイデアレベルの話のみ
アイデアレベルの話のみ
815デフォルトの名無しさん
2022/02/06(日) 14:11:31.07ID:Yc7Iwiyd (σ゚ω゚)σゲッツ
stdioのバッファ使うヤツ殆ど失敗作
stdioのバッファ使うヤツ殆ど失敗作
816デフォルトの名無しさん
2022/02/06(日) 14:22:31.03ID:yFNvdNoT #define マクロは単純置換のやつと関数形式のやつがある
#define A(a,b)
A();A(1);A(1,2,3);A(1,);A(,2);A;
結構めちゃくちゃなことやってもプリプロセスはエラー吐かない
引数足りないとか関数形式マクロの括弧がないのは意図しない使い方だろうからエラーにしてもらいたい気持ちはわかるが
というか<<802で言及されてるけど#if UNDEFINEDも非推奨にしてほしいわ
#define DEBUG
#define DEBUG 1
#define DEBUG 0
//#define DEBUG (undefined)
これらの全部のケースに対応できてねーし
#if DEBUG+0 とか書けとでも?
#define A(a,b)
A();A(1);A(1,2,3);A(1,);A(,2);A;
結構めちゃくちゃなことやってもプリプロセスはエラー吐かない
引数足りないとか関数形式マクロの括弧がないのは意図しない使い方だろうからエラーにしてもらいたい気持ちはわかるが
というか<<802で言及されてるけど#if UNDEFINEDも非推奨にしてほしいわ
#define DEBUG
#define DEBUG 1
#define DEBUG 0
//#define DEBUG (undefined)
これらの全部のケースに対応できてねーし
#if DEBUG+0 とか書けとでも?
817デフォルトの名無しさん
2022/02/06(日) 15:06:24.27ID:qvD4QsX7 俺のコードのg++やgccをcppに変えればプリプロセスの結果が出るよw オプション引数に-Eを付けても可w
別に不思議でも何でもない結果が表示されるw
$ cpp -x c++ - <<EOF
#define A(a,b) expanded
A();
A(1);
A(1,2,3);
A(1,);
A(,2);
A;
EOF
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
<stdin>:2:3: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:3:4: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:4:8: error: macro "A" passed 3 arguments, but takes just 2
<stdin>:1: note: macro "A" defined here
A;
expanded;
expanded;
A;
$
別に不思議でも何でもない結果が表示されるw
$ cpp -x c++ - <<EOF
#define A(a,b) expanded
A();
A(1);
A(1,2,3);
A(1,);
A(,2);
A;
EOF
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
<stdin>:2:3: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:3:4: error: macro "A" requires 2 arguments, but only 1 given
<stdin>:1: note: macro "A" defined here
A;
<stdin>:4:8: error: macro "A" passed 3 arguments, but takes just 2
<stdin>:1: note: macro "A" defined here
A;
expanded;
expanded;
A;
$
818デフォルトの名無しさん
2022/02/06(日) 16:46:37.28ID:XnD7OQcd インクルードガード書くときも単に
#define FOO_HPP
とするのと
#define FOO_HPP 1
と1にするのがあるがどちらが良いとかあるんだろうか
後者の方がconstexpr if文などのC++の言語機能と組み合わせて使えるというメリットがありそうだが
#define FOO_HPP
とするのと
#define FOO_HPP 1
と1にするのがあるがどちらが良いとかあるんだろうか
後者の方がconstexpr if文などのC++の言語機能と組み合わせて使えるというメリットがありそうだが
819デフォルトの名無しさん
2022/02/06(日) 16:54:43.06ID:W01LuusE 今から新規に書くなら #pragma once 一択
820はちみつ餃子 ◆8X2XSCHEME
2022/02/06(日) 17:09:14.27ID:u7K67HUJ >>818
私自身は前者にしてる。
インクルードしたことを示すためのフラグとしてのマクロが必要なら
(そういう事例に遭遇したことはないが) ガード用とは別にマクロ定義すると思う。
ガードのために定義したものをガード以外の目的で使うというのがちょっと汚く感じるから。
だけど分けちゃうと管理が二重になるのが嫌だと思う人もいるだろうし、
思想によるんじゃないの。
私は規格厨なので #pragma once は使わない。
まあ gcc と clang と msvc で使えるから事実上は問題にならないけど。
私自身は前者にしてる。
インクルードしたことを示すためのフラグとしてのマクロが必要なら
(そういう事例に遭遇したことはないが) ガード用とは別にマクロ定義すると思う。
ガードのために定義したものをガード以外の目的で使うというのがちょっと汚く感じるから。
だけど分けちゃうと管理が二重になるのが嫌だと思う人もいるだろうし、
思想によるんじゃないの。
私は規格厨なので #pragma once は使わない。
まあ gcc と clang と msvc で使えるから事実上は問題にならないけど。
821デフォルトの名無しさん
2022/02/06(日) 17:25:15.43ID:XnD7OQcd822はちみつ餃子 ◆8X2XSCHEME
2022/02/06(日) 17:46:04.51ID:u7K67HUJ >>821
NDEBUG は「デバッグモードとそうでないモードを切り替える」というのがその用途なので
それに沿うと思ったら分けずに NDEBUG を使うことはあるよ。
でも「NDEBUG の用途は assert の有効・無効の切り替えなので他に使うべきでない」と認識している人がいてもおかしくない。
規格に書いてあるのはこの場合はこうだという規則だけなので
抽象的な部分での意味の捉え方は人によってかなり幅がある。
そのあたりは文脈を察して常識的判断でやっていくしかないし、
チームでやってるなら話し合うしかしょうがない。
このへんはそんなにスッパリと判断基準を設けられるようなもんではないと思う。
NDEBUG は「デバッグモードとそうでないモードを切り替える」というのがその用途なので
それに沿うと思ったら分けずに NDEBUG を使うことはあるよ。
でも「NDEBUG の用途は assert の有効・無効の切り替えなので他に使うべきでない」と認識している人がいてもおかしくない。
規格に書いてあるのはこの場合はこうだという規則だけなので
抽象的な部分での意味の捉え方は人によってかなり幅がある。
そのあたりは文脈を察して常識的判断でやっていくしかないし、
チームでやってるなら話し合うしかしょうがない。
このへんはそんなにスッパリと判断基準を設けられるようなもんではないと思う。
823デフォルトの名無しさん
2022/02/06(日) 19:09:51.99ID:qvD4QsX7 MS発祥のモノが嫌われてるだけとも思うw
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 港区、中国に宣戦布告 中国外務省をおちょくる掲示物を展示 [175344491]
- 【ほんこん悲報】吉本新喜劇の中国公演が中止に! [523957489]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
