2016-07-13 12 views
1

ソースファイルの一部だけにCまたはC++言語標準を適用できますか?ソースファイルがC90に準拠していることを確認したいが、それはC99を必要とするいくつかのヘッダに依存する。これらのヘッダーのコンプライアンスは今私にとっては重要ではありません(私は当分C99でコンパイルできます)。しかし、将来的にはより限定的なプラットフォームにコードを移植するために必要な作業を最小限に抑えたいと思います。ソースファイルの一部だけに言語標準を適用しますか?

つまり、インクルードされたヘッダーを除いて、ファイル全体に適用する言語標準が必要です。ヘッダーインクルードがCおよびC++でどのように機能するかを考えると、一般的な問題は、特定のソースファイルの任意の部分に言語標準を適用することであると考えます。

私は特にGCCで作業していますが、これが他のコンパイラ(msvc、clang)でも可能であるかどうか不思議です。

+0

しかし、ファイル全体に関連するもの、ソースファイルとプログラム全体との間の「やりとり」が標準であることは知っていますか?ソースコードファイルの一部は、独自のバキュームには存在しません。 – deviantfan

+0

それのポイントは何ですか? @EugeneSh。 –

+0

- コンプライアンスを使用して標準準拠を実施することがアイデアです。 C90に準拠するようにファイルの依存関係をすべて調べ直すことができないとしても、開発中のソースファイルが古い標準でサポートされていない言語構造を使用しないことを主張できることは有益です。 –

答えて

3

C99を使用するヘッダーに依然として依拠しながらコードがC90互換であることを確認したい場合は、GCC警告フラグ-Wc90-c99-compatを有効にすることができます。これにより、C99の機能を使用できますが、C90で使用できない機能を使用する場合はいつでも警告が表示されます。ヘッダーファイル(おそらく正しい)にこれらの警告が生成されないようにするには、ファイルをインクルードした後にプラグマを使用して警告を有効にします。

これは基本的にあなたが望むものを達成します。警告は指定したコードに対してのみ生成されます。

#include "myheader.h" 

#pragma GCC diagnostic warning "-Wc90-c99-compat" 

void func(void) { ... } 

厳しいバージョンが使用することを次のようになります。

#pragma GCC diagnostic error "-Wc90-c99-compat" 

は、私の知る限りでは、クランはほとんど互換性がありますが、MSVCは本当によくそうそもそもC99をサポートしていない、あなたはしています自分で。

+0

これは私の問題を直接解決するので(コードの任意のセクションでの互換性の問題の警告/エラーのため)、これを受け入れたものとしてマークしました。 Jesper Juhlにお詫び申し上げます。Jesper Juhl氏の答えは技術的に問題に対処しています。 –

+0

追加の注意:皮肉なことに、これは私の問題を理論的に解決するに過ぎません。ここで指摘されている警告フラグはGCC 5以降にのみ存在します。それでも、警告を有効にし、より新しいGCCでコンパイルをテストすることでコンプライアンスをアサートすることができます。 –

+0

@ JackO'Reilly:GCC 5はおそらくすぐにあなたのプラットフォームに到着するでしょう。 –

3

いいえファイル(コンパイル単位)は、部分的に1つの言語標準と部分的には作成できません。

あなたはになります。ただし、ファイルを2つのファイルに分割し、それぞれ異なる言語標準を使用してコンパイルします(後で両方のオブジェクトファイルをリンクするように定義されていることを確認してください)。

もっと良い解決策は、すべてコードがより新しいまたは古い言語基準に準拠していることを確認してから使用することです。

+0

代替の解決策は、すべてのコードを古い言語標準でコンパイルし、それを使用することです。これは、ヘッダーを変換してC99機能を回避することを意味します。 – Peter

+0

答えをありがとう。私はファイルを2つに分割することを検討しましたが、より厳しいコンプライアンスのファイルには同じヘッダーを組み込み、同じ問題に遭遇する必要はありませんか? –

+0

@Peter確かに、古いものと新しいもののどちらにも合致するようにコードを編集しなければならない場合、古いものを目指すことは逆効果となります。 –

関連する問題