質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

381閲覧

VC++と規格書の相違点の確認方法について

nemumitakamaru

総合スコア22

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

3クリップ

投稿2019/02/03 14:05

編集2019/02/03 14:33

Visual C++ 2017において下記のソースコードがビルドでき、実行も可能です。

cpp

1#include <iostream> 2using namespace std; 3 4class Base { 5public: 6 virtual void PureVirtualFunction() = 0 { 7 cout << "Base::PureVirtualFunction" << endl; 8 } 9}; 10 11class Derived : public Base { 12public: 13 virtual void PureVirtualFunction() override { 14 Base::PureVirtualFunction(); 15 cout << "Derived::PureVirtualFunction" << endl; 16 } 17}; 18 19int main() { 20 Derived derived; 21 derived.PureVirtualFunction(); 22 return 0; 23}

出力結果

Base::PureVirtualFunction Derived::PureVirtualFunction

純粋仮想関数であるBase::PureVirtualFunction()の定義を書く際、=0に続けて定義を記述しています。
下記の複数のサイトによると、C++の規格書において、この書き方は規格違反となっており、VC++独自の拡張機能?のようです。

こういったVC++独自の拡張機能は他にも色々あると思うのですが、どのようにして確認すれば良いでしょうか?ドキュメント・ヘルプ・ヘッダファイル等、何かしら文章での解説が存在するのでしょうか?

上の例をMicrosoft Docsで調べてみたのですが、抽象クラス (C++) | Microsoft Docsのページを読んでみても、特にそういった記述は見受けられませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/03 14:38

拡張機能かどうかは分かりませんし、あるとした場合の一覧の在り処も分かりませんが、規格のどこまで対応していると言っているのかは以下にまとまっていると思います。 https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance?view=vs-2017 実際規格どおりに書いたとして、ビルドは通り、意図通りに動くのであれば、現実に困らない範囲でビルドエラー検出がなかったとしても、いいのでは?と個人的には思います。他の例を知りませんし、分かりませんけどね。以上回答にはなっていませんが、情報まで。
guest

回答2

0

ベストアンサー

規格書のとおりに動かして合わないところというのはドキュメントにもまとめられてたり情報も出回ってるけど、それ以外のこと、いわば拡張機能というのは普通は気にする必要はないし、気にしてませんね。

拡張機能はGCCでもよくあって、有名なものはドキュメントに載ったり情報が出回ってたりするんだけど、それを頼りにコードを書くというのはちと危険ですね

投稿2019/02/03 14:56

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nemumitakamaru

2019/02/10 08:08

皆様、ご回答ありがとうございます。 @y_waiwai 拡張機能がGCCにもよくあることを初めて知りました。 調べてみた所、例えばLinuxカーネルはGCCの拡張機能に依存してしまっているため、パッチを当てないとClangではビルドできないとのことで驚きました。 自分のように規格に詳しくない人が、ビルドが通るし拡張機能っぽくないから大丈夫?くらいのアバウトさでVC++でしか通用しない書き方で記述してしまい、後々移植等でGCC/Clangを用いることになったときにビルドができない事態が発生するのが少し微妙だなと思いました。 @wwbQzhMkhhgEmhU 言葉の定義をあまり理解できていないのですが、質問の例のような書き方は本当の意味での言語拡張ではないということでしょうか?では、一体何と呼べば良いでしょうか? 試しに、教えて頂いたサイトで言及されていた、言語拡張を無効にする /Za と準拠モードにする /permissive- の両方をプロジェクトに設定してみたのですが、ビルドに成功しました。
yohhoy

2019/02/15 06:48

完全に私見ですが、今回のVC++の挙動は「意図された言語拡張」というより、単に「コンパイラのバグ」と呼ぶべきものな気がします。(バグといっても、誰かが困るものではないですが)
wwbQzhMkhhgEmhU

2019/02/15 07:17

あ、私質問されてたのですね。 すみません。yohhoyさんの書いてくださった内容と同意見です。 名前は分かりません。私はバグとまでは思いませんけどね。 私が言いたかったのは、ある規格のどこまで機能的に対応しているか?と言った内容の一覧はありますよ、という話です(ざっくりですけどね)。その規格に、構文エラーとしてどこまで弾かなくてはならない、といった文面まであるのかどうか知らないので、規格どおりでないのかどうかまでは知りません。仮に記述があったとしても、目くじらを立てるような内容でもなく、似たようなもののリストがどこかにまとまっているか?と言われたら私は知らないというだけです。 言語拡張自体の目的は、昔からあるのだと、プラグマで処理系独自の機能を入れたり、呼び出し規約の指定や、インラインアセンブリを記述できるように予約語を入れたり、といったものが多かったと記憶してます。なので、今回のようなものを拡張機能と呼ぶことに少し違和感があり、そちらのリストは挙げなかった、ということです。 yohhoyさんフォローありがとうございます。 nemumitakamaruさんも気付かなくてごめんなさい。お礼の一文しか見てなかったです。
nemumitakamaru

2019/02/19 14:15

@yohhoy 意図されたものではなく、コンパイラのバグという可能性もあるのですね。その発想はありませんでした。 そこで、VC++の純粋仮想関数の挙動に関しては公式に対して聞いてみた方が良いかと思い、Developers Communityで同じような質問がないかを確認してみたところ、下記のページを見つけました。 VC++: Pure-specifier is erroneously permitted in a function definition. https://developercommunity.visualstudio.com/content/problem/121543/vc-pure-specifier-is-erroneously-permitted-in-a-fu.html 1年強ほどUnder Considerationとなっているようですが、回答されるのを気長に待ちたいと思います。 @wwbQzhMkhhgEmhU なるほどです。いえいえ、ご回答ありがとうございます。
guest

0

完全な一覧表は見たことがありませんが、下記ページに部分的な説明があるようです。

投稿2019/02/05 08:15

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nemumitakamaru

2019/02/10 07:53

ご回答ありがとうございます。 やはり、完全な一覧表のようなものは存在しなさそうですね。 教えて頂いたサイトを読んで、どういった機能があるかを勉強しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問