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 を出力するため、X 値ではなく Y 値

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

この行はコンパイルさえしません [ C2059、構文エラー: ")" ]

助けてくれてありがとう、アレックス

4

2 に答える 2

2

gcc4.9 でコンパイルすると問題なく動作するように見えますが、問題は、コンパイラ__WINDOW__RESOLUTION__が単一のパラメーターとしてスレッド化されることにある可能性があります。たとえば、

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(__WINDOW__RESOLUTION__))

#define __WINDOW__RESOLUTION__X__ (__WINDOW__X__(500, 200))

__WINDOW__X__パラメータが 1 つしかないため、エラーがスローされます。

...これは、マクロでandを使用して解決できます。これにより__VA_ARGS__、受け取ったパラメーターが転送されます。

#define __WINDOW__X__(...) __WINDOW__X__1(__VA_ARGS__)
#define __WINDOW__Y__(...) __WINDOW__Y__1(__VA_ARGS__)
于 2016-07-17T09:55:03.667 に答える
2

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

実際、あなたのコードには何の問題もありません。次のような基本的なテスト例でコンパイルすると、実際には正常に動作します。

// 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ので、それらを削除するだけで解決する可能性がありますが、これも私には必要ありませんでした(gcc 5.4下を使用ubuntu):

// 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__)

__二重のアンダースコアとそれに続く大文字は予約されていることも以前に指摘されましたが、確かにgccこれをコンパイルすることを止めませんでした - おそらく、より厳密なコンパイルフラグでエラーを生成するでしょう!

于 2016-07-17T08:53:41.207 に答える