5

私のヘッダーファイルはすべてインクルードガードpragma onceを使用しています:

#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H

class foo
{
    //foo interface..
};

#endif /* FILE_NAME_H */

pragma onceは標準ではなく、コンパイラ間で同じではない可能性があることは理解していますが、それが原因でエラーが発生する可能性はありますか? 最初に利用可能かどうかを何らかの方法でテストしたほうがよいでしょうか?

#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE
    #pragma once
#endif

#ifndef FILE_NAME_H
#define FILE_NAME_H

class foo
{
    //foo interface..
};

#endif /* FILE_NAME_H */

コンパイラ間の互換性を維持しながら、コンパイルを高速化し、名前の衝突を回避するオプションとしてpragma onceを提供したいと考えています。

4

2 に答える 2

10

サポートされていない場合#pragma onceは単に無視され[Ref#1]、ヘッダーガードが目的を果たします。したがって、両方を使用しても問題はありません。のサポートを確認する必要はありません#pragma once

したがって、理想的な方法は、両方を使用してガードを含めることであり、コンパイラがサポートする可能性#pragma onceのある最適化を利用できるポータブルコードがあります。#pragma once


[参照番号1]
標準C++03:16.6プラグマディレクティブ

フォームの前処理ディレクティブ

# pragma pp-tokensopt new-line

実装が実装定義の方法で動作するようにします。実装によって認識されないプラグマはすべて無視されます。

于 2012-05-28T04:24:13.167 に答える
5

標準では、「実装で認識されないプラグマは無視されます」と記載されているため、コンパイラが#pragmaを一度も知らなくても、おそらく問題ありません。

于 2012-05-28T04:17:52.400 に答える