2016-05-13 8 views
7

明らかに、コンパイラが@文字に遭遇すると、(コメントまたは文字列リテラルでない限り)構文エラーが発生します。しかし、文字が見つかった場合など。 #if 0ブロック内に、プログラムは技術的に有効ですか?@文字はCソースで使用できますか?

私はこの試みた:GCCと打ち鳴らすの両方で、-pedantic -Wall -Wextra

#define NOTHING(x) 

int main() 
{ 
    NOTHING(@@@@); 
    return 0; 
} 

をし、それが何の警告を与えませんでした。私はそれが働くことが保証されているかどうか、あるいは彼らがそれに対して特別な警告をしていないかどうかはわかりません。

標準で何か言い分が見つかりませんでしたが、気になっています。私はこれに基づいて標準のコンパイラがそれを突き止めていることを知るために、ツールをベースにしたくありません。

答えて

9

Cプログラムには、プリプロセッサによって削除または文字列化されているほとんどの文字を含めることができます。 @は有効なプリプロセッサトークンなので、コンパイルの前処理フェーズではエラーとしてフラグが立てられません。

標準では、コンパイラが何かについて警告を出すのを妨げず、コンパイラがこの場合に警告を出す可能性があります。しかし、私はそれが何かを知らないし、私はそれを実装の品質の問題と考えるだろう。

関連標準セクション:

  • 前処理トークン § 6.4での定義:「上記のいずれかのことはできません各非空白文字」。したがって、@@@@は、と4つのの前処理トークンであることに注意してください。

  • § 6.4/2、重点は加えた:「トークンに変換されるトークンを前処理する各キーワードの語彙形式、識別子、リテラル定数、文字列、またはpunctuatorを持たなければなりません。」 @が「トークンに変換されていない」限り、エラーは発生していません。トークンへの変換は、コンパイルプロセスのフェーズ7で行われます(§ 5.1.1.2/7参照)。それは4

+4

段階で、長い文字列化を含み、マクロの拡大、後のは、「@は有効なプリプロセッサトークンです」 - これは、ここで重要である、と関連する標準セクションでは、[C11セクション6.4]のようです(http://port70.net/~nsz/c/c11/n1570.html#6.4)、 'preprocessing-token'の定義には、他の前処理トークンカテゴリと一致しない空白以外の文字が含まれています。 – user2357112

+0

ありがとう!それは私の質問に完全に答えます。 – mtijanic

関連する問題