C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
テンプレここまで
探検
C++相談室 part151
■ このスレッドは過去ログ倉庫に格納されています
2020/05/14(木) 11:53:25.59ID:ZPCfyTux
2デフォルトの名無しさん
2020/05/14(木) 12:14:02.15ID:tvxDWcUo >>1
O2
O2
2020/05/14(木) 15:59:11.45ID:Qhhsb9+b
https://mevius.5ch.net/test/read.cgi/tech/1584975873/1000
> 1000 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 15:51:59.69 ID:X1Z5LMNW [4/4]
> ん?
> >未だにC++03にしがみついているわけがない
> >>993で17使ってると言ってたようだが
>
> てかもうちょい生産的な話出来んのか
> 仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
> 構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
なんだ、17で俺スゲーやってんのおまえじゃん
俺は仕事で17は当たり前という立場
おまえは仕事には危なくて使えないという立場
俺に教えを請うて突っぱねられたのがおまえ
あとはわかるな?
> 1000 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 15:51:59.69 ID:X1Z5LMNW [4/4]
> ん?
> >未だにC++03にしがみついているわけがない
> >>993で17使ってると言ってたようだが
>
> てかもうちょい生産的な話出来んのか
> 仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
> 構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
なんだ、17で俺スゲーやってんのおまえじゃん
俺は仕事で17は当たり前という立場
おまえは仕事には危なくて使えないという立場
俺に教えを請うて突っぱねられたのがおまえ
あとはわかるな?
2020/05/14(木) 16:04:10.28ID:X1Z5LMNW
5デフォルトの名無しさん
2020/05/14(木) 16:04:50.89ID:QxbT6fEj ホスト環境は17、組み込みは03で良いのでは?
2020/05/14(木) 16:06:44.92ID:Qhhsb9+b
2020/05/14(木) 16:07:42.33ID:Qhhsb9+b
2020/05/14(木) 16:44:48.92ID:7nN34odP
extern "C" 以下が、宣言になるなのか、定義になるのかについて、以下のページには、
extern "C" { int i; } と書くと、i は、「定義」される。
宣言で済ましたい場合には、
extern "C" { extern int i; }としなくてはならない。しかし、中括弧で囲まずに、
extern "C" int i;
と書いた場合には、i は「宣言」だけされる、とあります。
さらに、これは変数の場合で、関数の場合には、戻り値 関数名(仮引数列) の後に関数定義部の{・・・}
があるかどうかで宣言か定義かが変わるだけのようです。といいますか、関数の場合は、関数定義部
がなければ、「定義」しようがないのでそれは当然かもしれませんが(結構複雑です。)。
これらの動作について、cppreference などで述べられているページがあれば、
教えていただければ幸いです。
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c
Note that extern "C" { int i; } is a definition.
This may not be what you intended, next to the non-definition of void g(char);.
To make it a non-definition, you would need extern "C" { extern int i; }.
On the other hand, the one-declaration syntax without braces does make the declaration a non-definition: extern "C" int i; is the same as extern "C" { extern int i; }
extern "C" { int i; } と書くと、i は、「定義」される。
宣言で済ましたい場合には、
extern "C" { extern int i; }としなくてはならない。しかし、中括弧で囲まずに、
extern "C" int i;
と書いた場合には、i は「宣言」だけされる、とあります。
さらに、これは変数の場合で、関数の場合には、戻り値 関数名(仮引数列) の後に関数定義部の{・・・}
があるかどうかで宣言か定義かが変わるだけのようです。といいますか、関数の場合は、関数定義部
がなければ、「定義」しようがないのでそれは当然かもしれませんが(結構複雑です。)。
これらの動作について、cppreference などで述べられているページがあれば、
教えていただければ幸いです。
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c
Note that extern "C" { int i; } is a definition.
This may not be what you intended, next to the non-definition of void g(char);.
To make it a non-definition, you would need extern "C" { extern int i; }.
On the other hand, the one-declaration syntax without braces does make the declaration a non-definition: extern "C" int i; is the same as extern "C" { extern int i; }
2020/05/14(木) 17:19:49.87ID:7nN34odP
>>8
【関連事項】
[winnt.h の中]
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
[urlmon.h の中]
EXTERN_C const IID CLSID_CdlProtocol; // (100)
[考察]
(100)は、EXTERN_C のマクロ展開後
*pure C では、
extern const IID CLSID_CdlProtocol; // (101)
*C++ では、
extern "C" const IID CLSID_CdlProtocol; // (102)
となります。
(101)は明らかに(「定義」ではなく)「宣言」なので、モード間のバランスから考えて、
(102)も宣言でなくてはなりません。一方、
#ifdef __cplusplus
extern "C" {
#endif
int aaa;
#ifdef __cplusplus
}
#endif
と書いた場合、aaa は、どちらのモードでも「(変数)定義」であり、単なる「宣言」ではありません。
これは、(102)が「宣言」であることと、ある種の矛盾を生じているようですが、これが現状の
正しい解釈のようです。しかし、この事が cppreference のどこに書いてあるのかが分かりません。
【関連事項】
[winnt.h の中]
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
[urlmon.h の中]
EXTERN_C const IID CLSID_CdlProtocol; // (100)
[考察]
(100)は、EXTERN_C のマクロ展開後
*pure C では、
extern const IID CLSID_CdlProtocol; // (101)
*C++ では、
extern "C" const IID CLSID_CdlProtocol; // (102)
となります。
(101)は明らかに(「定義」ではなく)「宣言」なので、モード間のバランスから考えて、
(102)も宣言でなくてはなりません。一方、
#ifdef __cplusplus
extern "C" {
#endif
int aaa;
#ifdef __cplusplus
}
#endif
と書いた場合、aaa は、どちらのモードでも「(変数)定義」であり、単なる「宣言」ではありません。
これは、(102)が「宣言」であることと、ある種の矛盾を生じているようですが、これが現状の
正しい解釈のようです。しかし、この事が cppreference のどこに書いてあるのかが分かりません。
10デフォルトの名無しさん
2020/05/14(木) 17:25:47.90ID:xR/PZA9p 1回しか使われていない場合
2回以上使われている場合
「宣言」とは別に定義がリンクされている場合
2回以上使われている場合
「宣言」とは別に定義がリンクされている場合
2020/05/14(木) 17:33:00.93ID:7nN34odP
>>10
そういうことは理解しているつもりです。
extern ではなく、extern "C" の動作が、直後にブロックがあるかないかや、
変数か関数かによって、不思議な変化を見せることに興味があります。
そういうことは理解しているつもりです。
extern ではなく、extern "C" の動作が、直後にブロックがあるかないかや、
変数か関数かによって、不思議な変化を見せることに興味があります。
2020/05/14(木) 17:38:36.51ID:Qhhsb9+b
int aaa; //definition in C++, tentative in C
int aaa; //invalid in C++, valid in C
int aaa; //invalid in C++, valid in C
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】J1昇格PO決勝戦 千葉、来季のJ1昇格が決定 17年越しの悲願叶える…オリジナル10が05年以来のJ1にそろう [久太郎★]
- 南京で「大虐殺」追悼式典 中国、高市政権をけん制 (共同通信) [少考さん★]
- 【鹿児島】容疑者は大学生。国道3号を横断中の母娘を車ではねる――「太陽がまぶしくて見えなかった」。20歳女を現行犯逮捕 日置署 [ぐれ★]
- 中国・ロシア両軍の爆撃機が東京方面へ向かう「異例のルート」を共同飛行…核も搭載可能、連携して威嚇か ★5 [ぐれ★]
- 【日銀】0.75%に利上げへ 来週の決定会合で、30年ぶり水準 賃金改善の継続見込む [ぐれ★]
- 京都のホテル大幅値下げ 訪日中国人客、年1000万人目前で急ブレーキ ★3 [蚤の市★]
- 海外メディア、高市政権の経済政策を酷評「偽サッチャー」「自滅的」「時代遅れ」 [163661708]
- 【急募】今後、高市政権で追加されそうな税金、増税 [943688309]
- アイ・オー・データのSSD、HDD、USBメモリなど値上げ。最大54.8% [742348415]
- なかやま〜きんにくんだよ〜みたいな事言う女芸人いたじゃん?
- 【実況】博衣こよりのえちえちドラクエ1&2リメイク🧪★3🏡
- 日本人、気づきはじめる「庶民の生活が苦しいのは金持ちが節税したりして金溜め込んでるから。大企業の内部留保もどうにかしろ」 [434776867]
