2016-07-17 4 views
1

だから、これは私のコードです:なぜこのマクロは構文エラーを生成していますか?

// Defines a tuple 
#define __WINDOW__RESOLUTION__ 500, 200 

// Seperate the tuple 
#define __WINDOW__X__1(Width, Height) (Width) 
#define __WINDOW__Y__1(Width, Height) (Height) 

// Add another sort of indirection because my tuple is a macro 
#define __WINDOW__X__(Macro) __WINDOW__X__1(Macro) 
#define __WINDOW__Y__(Macro) __WINDOW__Y__1(Macro) 

// These should be the final values 500 and 200 
#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__)) 
#define __WINDOW__RESOLUTION__Y__ (__WINDOW__Y__(__WINDOW__RESOLUTION__)) 

私は最終的な数は、何かする必要があります最初のマクロが間違って行くように思わ使用する場合:ライン上の

std::cout << __WINDOW__RESOLUTION__X__ << std::endl; // Outputs 200 instead of 500 

は、数200を出力するので、Yこの行でもコンパイルされません

std::cout << __WINDOW__RESOLUTION__Y__ << std::endl; // ERR with macro underlined 

代わりに、X値の値[C2059を、構文エラー: ")"]

アレックスを助けてくれてありがとうございました

+3

[2つの先頭のアンダースコアで名前を使用するか、またはアンダースコアが上位に続いてはいけません大文字の手紙、それらはすべてのスコープで予約されている](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier)。 –

+1

あなたの問題については、前処理されたコードを生成してそれを見てください。 –

+2

私はこのようなものをプロダクションコードで見つけることに恐れています...プリプロセッサの使用ができる限り制限されるべきであるという一般的なガイドラインに精通しています。単純に 'const int WindowX = 500;を使わないのはなぜですか? const int WindowY = 200; '? –

答えて

1

記録のために - あなたの解決策は「これをしないでください」と私は理解していますが、依然として元の質問に対する回答を提供したいと思いました。

実際には、実際には何も表示されませんあなたのコードでが間違っています。あなたはこのような基本的なテストの例でそれをコンパイルした場合には、実際に正常に動作します:

// Defines a tuple 
#define __WINDOW__RESOLUTION__ 500, 200 

// Seperate the tuple 
#define __WINDOW__X__1(Width, Height) (Width) 
#define __WINDOW__Y__1(Width, Height) (Height) 

// Add another sort of indirection because my tuple is a macro 
#define __WINDOW__X__(Macro) __WINDOW__X__1(Macro) 
#define __WINDOW__Y__(Macro) __WINDOW__Y__1(Macro) 

// These should be the final values 500 and 200 
#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__)) 
#define __WINDOW__RESOLUTION__Y__ (__WINDOW__Y__(__WINDOW__RESOLUTION__)) 

#include <iostream> 
using namespace std; 

int main() { 
    // your code goes here 
    std::cout << __WINDOW__RESOLUTION__X__ << std::endl; 
    std::cout << __WINDOW__RESOLUTION__Y__ << std::endl; 
    return 0; 
} 

それはあなたのエラーはあなたの最後のmacroでブラケットに関連することができるように、しかし、これだけそれらを削除すると、おそらくそれを解決する可能性が見えますしかし、再び - これが私のために必要ではなかった(ubuntugcc 5.4を使用して):

// These should be the final values 500 and 200 
#define __WINDOW__RESOLUTION__X__ __WINDOW__X__(__WINDOW__RESOLUTION__) 
#define __WINDOW__RESOLUTION__Y__ __WINDOW__Y__(__WINDOW__RESOLUTION__) 
それは以前にも「大文字に続いて二重のアンダースコア __が予約されているが、それは確かにdidnのことが指摘された

t stop gccからこれを編集 - しかし、より厳密なコンパイルフラグでエラーを生成するかもしれません!

+0

私はクリスを助けてくれてありがとう、私は本当にあなたが私を助けているという事実に感謝します。私は知らないですが、私が焦点を当てる前に、私は言語を学ばなければなりません。そして、あなたはそれを達成するために一歩近づくのを手伝っただけです。とてもありがとう!^_^ – Brogramer

+0

まあ、あなたが知っているのは、何をすべきか/してはいけないのかということです。しかし、あなたのコードはどのように見えるのでしょうか? – Chris

+0

また、 'using namespace std;'はbの広告のアイディアです –

2

gcc4.9でコンパイルするとうまくいくようですが、コンパイラスレッド__WINDOW__RESOLUTION__が単一のパラメータとして問題になることがあります。 __WINDOW__X__のみ1つのパラメータを期待するのでたとえば、あなたが

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(500, 200)) 

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__)) 

を交換する場合は、エラーがスローされます。

あなたはそれを受け取ることを任意のパラメータを転送しますこれ、あなたのマクロで...__VA_ARGS__を使用することによってこの問題を解決することができます

#define __WINDOW__X__(...) __WINDOW__X__1(__VA_ARGS__) 
#define __WINDOW__Y__(...) __WINDOW__Y__1(__VA_ARGS__) 
関連する問題