cat test.cpp #define SET_ALLIGN_FN(what) -6ren">
gpt4 book ai didi

c++ - g++ 在宏上提示 "does not give a valid preprocessing token"而 vc++ 编译正常

转载 作者:行者123 更新时间:2023-11-28 00:25:43 29 4
gpt4 key购买 nike

考虑以下使用 VC++ 编译但无法使用 g++ 编译的 C++ 程序

D:\temp>cat test.cpp
#define SET_ALLIGN_FN(what) \
void set_##what##_fn() { }
SET_ALLIGN_FN(Left);
#undef SET_ALLIGN_FN
template<class _Arg> struct Smanip{
Smanip(void( *pFun)(_Arg), _Arg val):m_pFun(pFun), m_val(val) { }
void( *m_pFun)(_Arg);
_Arg m_val;
};
template<> struct Smanip<void> {
Smanip(void( *pFun)()) : m_pFun(pFun) { }
void( *m_pFun)();
};
#define SET_ALLIGN(what) \
static Smanip<void> ##what##Allign() \
{ return (Smanip<void>(set_##what##_fn)); }
SET_ALLIGN(Left);
#undef SET_ALLIGN

int main() { }
D:\temp>cl test.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

D:\temp>g++ test.cpp
test.cpp:15:23: error: pasting ">" and "Left" does not give a valid preprocessin
g token
static Smanip<void> ##what##Allign() { return (Smanip<void>(set_##what##_
fn)); }
^
test.cpp:16:5: note: in expansion of macro 'SET_ALLIGN'
SET_ALLIGN(Left);
^

我不明白的是为什么 g++ 提示无效 token 。编译器突出显示 >,但这不是宏生成的代码。

最佳答案

行内

static Smanip<void>  ##what##Allign()

您尝试连接 >what。尝试使用

static Smanip<void>  what##Allign()

关于c++ - g++ 在宏上提示 "does not give a valid preprocessing token"而 vc++ 编译正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241217/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com