none
VC++2015 マクロがコンパイル通らない RRS feed

  • 質問

  • VC++2010でのプロジェクトをVC++2015でコンパイルしようとしているのですが、コンパイルが通りません。
    調べてみたのですが、ユーザー定義のリテラルをサポートしたので、マクロと文字列を空白で開ける必要がある等が書かれていましたが、
    下記の場合にどのように対応したらよいかが分かりません。

    マクロ定義

    #define CLSID_GUID_SUBKEY(key) _T("CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\") ## key

    使用しているところ

    CLSID_GUID_SUBKEY(_T("")),

    CLSID_GUID_SUBKEY(_T( "DefaultIcon" )),

    ビルドエラー

    error C3688: リテラル サフィックス '_T' が無効です。リテラル演算子またはリテラル演算子テンプレート 'operator ""_T' が見つかりません

    どの様に修正するのでしょうか。

    2016年10月27日 5:28

回答

  • UNICODEが定義されていて、マクロ定義

    #define CLSID_GUID_SUBKEY(key) _T("CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\") ## key


    でCLSID_GUID_SUBKEY(L"DefaultIcon")と記述すると、単純に文字列の連結で

    L"CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\"L"DefaultIcon"


    と解釈されてしまいますので、引数に _T や L は必要なく単に

    CLSID_GUID_SUBKEY("DefaultIcon")


    とするとよいと思います。

    参考サイト: トークン連結演算子(##)

    • 編集済み kenjinoteMVP 2016年10月27日 6:56
    • 回答としてマーク TAKAKUN 2016年10月27日 7:09
    2016年10月27日 6:45

すべての返信

  • tchar.hに _T() マクロが定義されていますので、これを #include してください。
    2016年10月27日 6:02
  • _T("")自体は使用できていますが、提示したマクロを使用するとエラーが発生します。

    CLSID_GUID_SUBKEY(L"") でも、

     error C3688: リテラル サフィックス 'L' が無効です。リテラル演算子またはリテラル演算子テンプレート 'operator ""L' が見つかりません。

    とエラーとなります

    • 編集済み TAKAKUN 2016年10月27日 6:24
    2016年10月27日 6:21
  • UNICODEが定義されていて、マクロ定義

    #define CLSID_GUID_SUBKEY(key) _T("CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\") ## key


    でCLSID_GUID_SUBKEY(L"DefaultIcon")と記述すると、単純に文字列の連結で

    L"CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\"L"DefaultIcon"


    と解釈されてしまいますので、引数に _T や L は必要なく単に

    CLSID_GUID_SUBKEY("DefaultIcon")


    とするとよいと思います。

    参考サイト: トークン連結演算子(##)

    • 編集済み kenjinoteMVP 2016年10月27日 6:56
    • 回答としてマーク TAKAKUN 2016年10月27日 7:09
    2016年10月27日 6:45
  • #define CLSID_GUID_SUBKEY(key) _T("CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\") ## key

    #define CLSID_GUID_SUBKEY(key) _T( "CLSID\\{xxxxxx-xxxx-xxx-xxx-xxxx}\\") ## key

    に変えてみたらどうでしょう(_T( の後ろにスペースを入れてみる)。

    ・・・_Tの部分がトークンとして分離できないのかもしれません(ユーザー定義リテラルの仕様の影響かな)。

    2016年10月27日 6:55
  • CLSID_GUID_SUBKEY("DefaultIcon")でコンパイルはとおっていたのですが、
    理解ができていませんでした。

    理解できました。ありがとうございました。


    2016年10月27日 7:09