2016-06-01 14 views
0

無効な文字マクロで使用できないものはありますか?
#define TE$T 8が動作しているようですので、$が有効です。
誰かが無効な文字のリストを持っていますか? (または逆に有効なもののリスト)。Cプリプロセッサ/マクロに無効な文字がありますか?

+0

マクロ識別子が数字で起動しないことがあります。 – alk

答えて

2

これは、識別子として$の使用を許可するコンパイラです。 -pedanticなどでコンパイルすると、標準ではないので、他のコンパイラがコンパイラにコンパイラを提供することを期待してはいけません。 C11のドラフトの一般的な拡張付録で

J.5.2専門識別子

はの一部ではないことを、アンダースコア以外の文字_、文字、数字、基本ソース文字セット(ドル記号$などのまたは各国文字セットの文字)が識別子(6.4.2)に表示されることがあります。

6.4.2ショー何文字すべての準拠のコンパイラ サポートにあります。

6.4.2 Identifiers 
6.4.2.1 General 
Syntax 1   identifier: 
       identifier-nondigit 
       identifier identifier-nondigit 
       identifier digit 
     identifier-nondigit: 
       nondigit 
       universal-character-name 
       other implementation-defined characters 
     nondigit: one of 
       _ a b   c d e f  g h i j  k l m 
        n o   p q r s  t u v w  x y z 
        A B   C D E F  G H I J  K L M 
        N O   P Q R S  T U V W  X Y Z 
     digit: one of 
       0 1  2  3 4 5 6  7 8 9 

あなたがそれらに自分自身を制限する必要があります。

1

マクロ名は英数字とアンダースコア( 'a-z'、 'A-Z'、 '0-9'、 '_')で構成され、最初の文字は数字であってはなりません。一部のプリプロセッサでは、ドル記号「$」も使用できますが、使用しないでください。

も... What are the valid characters for macro names?

1

をこの上の顔をしているとても$が有効である、#define TE$T 8が働いているようです。

これは正しくありません。 $は、標準Cの識別子の有効な文字ではありません。たとえば、GCCなどの一部のコンパイラでは、識別子として$を拡張子として使用できます。 (Dollar Signsを参照してください)

あなたは間違った質問をしています。マクロ内の名前には特別なものはありません。すべてのプリプロセッサはテキストの置き換えです。

+0

間違っている!標準では必須ではありませんが、標準ではそのような追加文字を使用できるので、特定の実装(gccなど)では非常に有効な文字です。 – Olaf

0

がsomefille.c

#include<stdio.h> 
#define NAM$ "SomeName" 
int main(void) 
{ 
printf("Name - %s\n",NAM$); 

return 0; 
} 

gcc -pedantic somefille.c -o somefille 

で上記のコンパイルを検討することは、あなたに

somefille.c:2:9: warning: '$' in identifier or number [enabled by default] 
#define NAM$ "SomeName" 

を与えるこの[ page ]氏は述べています。

-pedantic
は、厳格なISO CとISO C++で要求されたすべての警告を発行します。禁止された拡張子を使用するすべてのプログラムと、ISO CおよびISO C++に従わない他のいくつかの プログラムを拒否します。 ISO Cでは、使用される-stdオプションで指定されたISO C標準の バージョンに従います。

マクロ名にはスペースが含まれていなくてはならず、C変数に従う命名規則と同じでなければなりません。英字、数字、およびアンダースコア(_)文字のみ使用できます、最初の文字は数字にすることはできません。

問題は、さまざまなコンパイラがこれに準拠していないことです。例は上記のgccです。

  1. マクロ名は、あなたがこれを侵害した場合は以下のようにエラーが出ることがあり、数字で始めることはできません:

    error: macro names must be identifiers 
    
  2. はルールの下にまだ従っている、と述べましたマクロ名にはスペースを入れてはいけません。例えば#define FULL NAME "Your name"のためにあなたに与えます:

    error: ‘NAME’ undeclared (first use in this function) 
    
+0

間違っている!標準では必須ではありませんが、標準ではそのような追加文字を使用できます。したがって、特定の実装(gccなど)では有効な文字(マクロ名に固有ではありません。 – Olaf

+0

@Olaf:標準的な機能IMHO以外は許可しない "厳格なISO C"について言及しました。 – sjsam

+0

引用した段落をよくお読みください。標準では、追加の文字を明示的に許可します。標準にしばしば違反する拡張機能にもかかわらず。 – Olaf

関連する問題