2017-05-10 5 views
0

これは非常に基本的な質問であるべきです、私はいくつかの名前を変更することによってこの状況を避けることができますが、私はここで何かが不足していると思うかもしれません。
この問題の最も簡単なコードを作成しました。Cの#defineからの名前の競合を回避するにはどうすればよいですか? (またはC++)

conv.h : 
    1 struct convpar_ { 
    2 int K; 
    3 } convpar_; 

test.c : 
    1 #include <stdio.h> 
    2 #include "conv.h" 
    3 
    4 #define K 7 
    5 
    6 typedef struct convpar_ convpar; 
    7 
    8 void func1(convpar cp) 
    9 { 
10 printf("cp.K = %d\n", cp.K); 
11 } 
12 
13 main() 
14 { 
15 convpar cp = {K}; 
16 
17 func1(cp); 
18 } 

私はcc test.c -o testをすれば、私は私が4行目に「7」と文字「K」を定義し、これがライン10は、前処理後printf("cp.7" = %d\n", cp.7);が表示されますので、これは知っている

cc  test.c -o test 
test.c: In function 'func1': 
test.c:13: error: expected identifier before numeric constant 

を取得します。私がconvpar_のメンバーKの名前を何か他のもの(例えばKi)に変更すると、この問題は解消されます。

しかし、時々、定数を定義したいときや、グローバル変数の名前や、同じファイルで使用する構造体のメンバ変数のような場合があります。この問題を解決する正しい方法は何ですか? (これはC++にも当てはまります)

+1

'C++ 'では、名前空間を使用できます。 'C'と' C++ 'では、名前を変更できます。 – druckermanly

+3

マクロを使わないでください( '#define')。定数が必要な場合は、(名前空間内の) 'const'(または' constexpr')変数を使います。 –

+0

'#if defind xxx'ステートメントを使用します。 – luoluo

答えて

1

これはプリプロセッサの目標であるため、回避することはできません。オンザフライでコードを修正することです。ソリューションは良いコーディング手法を採用することです:一般的なプログラミングにプリプロセッサを使用しないでください。また、名前空間に名前付け規則を使用します。 K何? CONVERSION_ID_K、CONVERSION_ID_Lなどの名前を付けます。変数などには小文字を使用してください。

+0

ok、多分それは一般的な答えです。また、私はJeper Juhlのコメント(#defineではなくconst intを使用してください)が有用であることを発見しました。 –

+0

あなたは私に新しい質問に対する答え/コメントを与えることができれば感謝します:http://stackoverflow.com/questions/43884007/in-c-how-to-define-a-macro-using-other-macros-いつ他のマクロ・レイジング・ネーム –

関連する問題