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

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

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

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

Q&A

解決済

1回答

2252閲覧

C++ の #pragma once について

harpy

総合スコア42

C++

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

0グッド

0クリップ

投稿2019/06/12 00:23

'#pragma once'をファイルの先頭に必ずつけているのですが、これってなにか問題起こりえますか?

今の私の理解では、'#pragma once'はコンパイラさんにファイルインクルードするときに同じのは何回もインクルードしないでね!
って教えるためだと思っています。

いちいちファイルのインクルード関係を覚えておくというか、自分でチェックするのは面倒だということで使っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pragma onceは標準C++文法には無く、コンパイラに依る拡張です。
参考処理系定義の動作の制御 - cppreference.com

なにか問題起こりえますか?

コンパイラを変えたときに書き換えが必要になる可能性があります。

いちいちファイルのインクルード関係を覚えておくというか、自分でチェックするのは面倒

そもそもそれは無理です。
ヘッダ内で他のヘッダをインクルードするのもよく有る話なので、すぐに破綻します。

pragma onceを避けるなら、インクルードガードを逐一書いてやれば良いです。

投稿2019/06/12 00:28

編集2019/06/12 00:31
LouiS0616

総合スコア35660

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

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

harpy

2019/06/12 00:32

回答ありがとうございます。 この後自分でも調べますが、インクルードガードというのはコンパイラに依存しないのでしょうか? 環境はVC++前提なのでコンパイラを変えないのでひとまず問題なさそうで安心しました。
LouiS0616

2019/06/12 00:38

インクルードガードはマクロを利用しているだけなので、どのコンパイラでも可能です。 問題があるとすれば、こんなところでしょうか。 ・面倒 ・マクロ名が衝突する恐れ
asm

2019/06/12 00:50 編集

横から失礼します。 インクルードガードも気をつけないと予約語のルールに違反したマクロ名が散見されています。 グローバル スコープを持ち、_ で始まる名前 _ で始まり、その次が大文字の名前 __ を含む名前 はC++の規格によって予約されユーザーの利用は禁止されています。
LouiS0616

2019/06/12 01:09

@asm さん 確かにそのことにも充分留意する必要がありますね。大変有用なコメントありがとうございます。
harpy

2019/06/12 02:02

asmさま、LouiS0616さま ありがとうございます。 スッキリ理解できました。 また機会がありましたら、その時はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問