关于#pragma push_macro("new") .

本文介绍了一种在C/C++中管理宏定义的技巧,利用预处理指令实现宏定义的临时取消与恢复,避免关键字冲突,并通过示例展示了如何操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在三方库源码中,我们经常看到这样的代码:

#pragma push_macro("new")

#undef new

// do something with new

......

#pragma pop_macro("new")

它的作用就是将宏定义new压入栈并取消它(指的是宏)的定义,如此一来,new的本来含义便获得了恢复,使用完毕后将宏定义new弹出栈,恢复宏定义。

不过,仍有下面两个问题需要回答。

1)宏定义名不会与关键字new冲突吗?

2)宏定义new有何作用?

问题1

    宏定义名若与保留的关键字相同,编译器并不会提示错误,而是用最新定义的宏定义代替关键字发挥作用。下面是一个例子,定义了宏int。例程能顺利通过编译链接,其运行结果为8,4,8,与预期相同。

// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#define int double

void _tmain(int argc, _TCHAR* argv[])
{
	int iOne = 1;
	cout<<sizeof(iOne)<<endl;
    #pragma push_macro("int")
    #undef int
	int iTwo = 2;
	cout<<sizeof(iTwo)<<endl;
    #pragma pop_macro("int")

	int iSecond=2;
	cout<<sizeof(iSecond)<<endl;
	system("pause");
}


 

解析:运行结果为8 ,4,8

        宏定义,如#define PI 3.1415926   把程序中出现的PI全部换成3.1415926

        #define int double   该句话表明,把程序中出现int的地方全部替换为double ,(int iOne = 1;cout<<sizeof(iOne)<<endl;相当于iOne为double类型,所以输出8)

 

#pragma push_macro("int")

#undef intint iTwo = 2;

cout<<sizeof(iTwo)<<endl;

#pragma pop_macro("int")

      
上面几句的意思是,将将宏定义int压入栈并取消它(指的是宏)的定义,如此一来,int的本来含义便获得了恢复,即int仍代表int。使用完毕后将宏定义int弹出栈,恢复宏定义即int代表double。

ny@wxsc07:~/new/dxp_test_bak - new$ make clean && make CFLAGS="-g" rm -f main.o src/generate_box_pairs.so src/info_partition.so src/output_bin.so src/get_org_info.so src/generate_box_pairs.o src/info_partition.o src/output_bin.o src/get_org_info.o dxp_test mpic++ -I ./include -I /tools/Xilinx/Vitis_HLS/2022.2/include/ -O3 -fPIC -c main.cpp -o main.o In file included from ./include/md_fix.h:5, from main.cpp:7: ./include/ppip_float.h:7: warning: "__always_inline" redefined 7 | #define __always_inline //__attribute__((always_inline)) inline | In file included from /usr/include/features.h:461, from /usr/include/x86_64-linux-gnu/bits/libc-header-start.h:33, from /usr/include/stdio.h:27, from main.cpp:1: /usr/include/x86_64-linux-gnu/sys/cdefs.h:319: note: this is the location of the previous definition 319 | # define __always_inline __inline __attribute__ ((__always_inline__)) | mpic++ -I ./include -I /tools/Xilinx/Vitis_HLS/2022.2/include/ -O3 -fPIC -c src/generate_box_pairs.cpp -o src/generate_box_pairs.o In file included from ./include/md_fix.h:5, from src/generate_box_pairs.cpp:1: ./include/ppip_float.h:7: warning: "__always_inline" redefined 7 | #define __always_inline //__attribute__((always_inline)) inline | In file included from /usr/include/features.h:461, from /usr/include/x86_64-linux-gnu/c++/9/bits/os_defines.h:39, from /usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h:528, from /usr/include/c++/9/bits/stl_algobase.h:59, from /usr/include/c++/9/deque:60, from /usr/include/c++/9/queue:60, from /tools/Xilinx/Vitis_HLS/2022.2/include/hls_stream.h:23, from ./include/md_fix.h:4, from src/generate_box_pairs.cpp:1: /usr/include/x86_64-linux-gnu/sys/cdefs.h:319: note: this is the location of the previous definition 31
03-26
In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:296:39: warning: explicit conversion operators only available with -std=c++11 or -std=gnu++11 [enabled by default] G_EXPLICIT_OP operator bool() const G_NOEXCEPT ^ src/greenlet/greenlet_greenlet.hpp:296:39: error: expected ‘;’ at end of member declaration In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:296:45: note: in expansion of macro ‘G_NOEXCEPT’ G_EXPLICIT_OP operator bool() const G_NOEXCEPT ^ src/greenlet/greenlet_compiler_compat.hpp:79:29: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls(const Cls& other) = delete; \ ^ src/greenlet/greenlet_greenlet.hpp:316:9: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(Greenlet); ^ src/greenlet/greenlet_compiler_compat.hpp:80:40: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls& operator=(const Cls& other) = delete ^ src/greenlet/greenlet_greenlet.hpp:316:9: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(Greenlet); ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:345:39: error: expected ‘;’ at end of member declaration inline intptr_t stack_saved() const G_NOEXCEPT ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:345:45: note: in expansion of macro ‘G_NOEXCEPT’ inline intptr_t stack_saved() const G_NOEXCEPT ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:355:42: error: expected ‘;’ at end of member declaration inline const char* stack_start() const G_NOEXCEPT ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:355:48: note: in expansion of macro ‘G_NOEXCEPT’ inline const char* stack_start() const G_NOEXCEPT ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:389:39: error: expected ‘;’ at end of member declaration inline void slp_restore_state() G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:389:41: note: in expansion of macro ‘G_NOEXCEPT’ inline void slp_restore_state() G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:390:55: error: expected ‘;’ at end of member declaration inline int slp_save_state(char *const stackref) G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:390:57: note: in expansion of macro ‘G_NOEXCEPT’ inline int slp_save_state(char *const stackref) G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:428:45: error: expected ‘;’ at end of member declaration virtual ThreadState* thread_state() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:428:51: note: in expansion of macro ‘G_NOEXCEPT’ virtual ThreadState* thread_state() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:432:51: error: expected ‘;’ at end of member declaration virtual bool was_running_in_dead_thread() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:432:57: note: in expansion of macro ‘G_NOEXCEPT’ virtual bool was_running_in_dead_thread() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:436:41: error: expected ‘;’ at end of member declaration virtual BorrowedGreenlet self() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:436:47: note: in expansion of macro ‘G_NOEXCEPT’ virtual BorrowedGreenlet self() const G_NOEXCEPT = 0; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:490:53: error: expected ‘;’ at end of member declaration virtual OwnedGreenlet g_switchstack_success() G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:490:55: note: in expansion of macro ‘G_NOEXCEPT’ virtual OwnedGreenlet g_switchstack_success() G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:333:63: error: ‘nullptr’ was not declared in this scope const OwnedObject context(const typename IsPy37::IsIt=nullptr) const; ^ src/greenlet/greenlet_greenlet.hpp:336:85: error: ‘nullptr’ was not declared in this scope inline void context(refs::BorrowedObject new_context, typename IsPy37::IsIt=nullptr); ^ src/greenlet/greenlet_greenlet.hpp: In constructor ‘greenlet::Greenlet::switchstack_result_t::switchstack_result_t()’: src/greenlet/greenlet_greenlet.hpp:458:43: error: ‘nullptr’ was not declared in this scope the_state_that_switched(nullptr) ^ src/greenlet/greenlet_greenlet.hpp: In constructor ‘greenlet::Greenlet::switchstack_result_t::switchstack_result_t(int)’: src/greenlet/greenlet_greenlet.hpp:463:43: error: ‘nullptr’ was not declared in this scope the_state_that_switched(nullptr) ^ src/greenlet/greenlet_greenlet.hpp: At global scope: src/greenlet/greenlet_greenlet.hpp:561:51: error: expected ‘;’ at end of member declaration virtual bool was_running_in_dead_thread() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:561:57: note: in expansion of macro ‘G_NOEXCEPT’ virtual bool was_running_in_dead_thread() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:562:45: error: expected ‘;’ at end of member declaration virtual ThreadState* thread_state() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:562:51: note: in expansion of macro ‘G_NOEXCEPT’ virtual ThreadState* thread_state() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:578:41: error: expected ‘;’ at end of member declaration virtual BorrowedGreenlet self() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:578:47: note: in expansion of macro ‘G_NOEXCEPT’ virtual BorrowedGreenlet self() const G_NOEXCEPT; ^ src/greenlet/greenlet_compiler_compat.hpp:79:29: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls(const Cls& other) = delete; \ ^ src/greenlet/greenlet_greenlet.hpp:588:13: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(ParentIsCurrentGuard); ^ src/greenlet/greenlet_compiler_compat.hpp:80:40: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls& operator=(const Cls& other) = delete ^ src/greenlet/greenlet_greenlet.hpp:588:13: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(ParentIsCurrentGuard); ^ src/greenlet/greenlet_compiler_compat.hpp:79:29: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls(const Cls& other) = delete; \ ^ src/greenlet/greenlet_greenlet.hpp:606:9: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(MainGreenlet); ^ src/greenlet/greenlet_compiler_compat.hpp:80:40: warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default] Cls& operator=(const Cls& other) = delete ^ src/greenlet/greenlet_greenlet.hpp:606:9: note: in expansion of macro ‘G_NO_COPIES_OF_CLS’ G_NO_COPIES_OF_CLS(MainGreenlet); ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:624:51: error: expected ‘;’ at end of member declaration virtual bool was_running_in_dead_thread() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:624:57: note: in expansion of macro ‘G_NOEXCEPT’ virtual bool was_running_in_dead_thread() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:625:45: error: expected ‘;’ at end of member declaration virtual ThreadState* thread_state() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:625:51: note: in expansion of macro ‘G_NOEXCEPT’ virtual ThreadState* thread_state() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:626:39: error: expected ‘;’ at end of member declaration void thread_state(ThreadState*) G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:626:41: note: in expansion of macro ‘G_NOEXCEPT’ void thread_state(ThreadState*) G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:628:41: error: expected ‘;’ at end of member declaration virtual BorrowedGreenlet self() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_internal.hpp:17:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_compiler_compat.hpp:66:20: error: ‘noexcept’ does not name a type #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:628:47: note: in expansion of macro ‘G_NOEXCEPT’ virtual BorrowedGreenlet self() const G_NOEXCEPT; ^ src/greenlet/greenlet_compiler_compat.hpp:66:20: error: expected initializer before ‘noexcept’ #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:694:68: note: in expansion of macro ‘G_NOEXCEPT’ void ExceptionState::operator<<(const PyThreadState *const tstate) G_NOEXCEPT ^ src/greenlet/greenlet_compiler_compat.hpp:66:20: error: expected initializer before ‘noexcept’ #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:703:62: note: in expansion of macro ‘G_NOEXCEPT’ void ExceptionState::operator>>(PyThreadState *const tstate) G_NOEXCEPT ^ src/greenlet/greenlet_compiler_compat.hpp:66:20: error: expected initializer before ‘noexcept’ #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:713:30: note: in expansion of macro ‘G_NOEXCEPT’ void ExceptionState::clear() G_NOEXCEPT ^ src/greenlet/greenlet_compiler_compat.hpp:66:20: error: expected initializer before ‘noexcept’ #define G_NOEXCEPT noexcept ^ src/greenlet/greenlet_greenlet.hpp:722:61: note: in expansion of macro ‘G_NOEXCEPT’ int ExceptionState::tp_traverse(visitproc visit, void* arg) G_NOEXCEPT ^ src/greenlet/greenlet.cpp:187:32: error: expected declaration before end of line # pragma GCC diagnostic push ^ In file included from src/greenlet/greenlet_greenlet.hpp:11:0, from src/greenlet/greenlet_internal.hpp:20, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_refs.hpp:67:9: warning: inline function ‘void greenlet::refs::MainGreenletExactChecker(void*)’ used but never defined [enabled by default] MainGreenletExactChecker(void *p); ^ src/greenlet/greenlet_refs.hpp:181:19: warning: inline function ‘T* greenlet::refs::PyObjectPointer<T, <anonymous> >::borrow() const [with T = _greenlet; void (* TC)(void*) = greenlet::refs::MainGreenletExactChecker]’ used but never defined [enabled by default] inline T* borrow() const G_NOEXCEPT ^ src/greenlet/greenlet_refs.hpp:181:19: warning: inline function ‘T* greenlet::refs::PyObjectPointer<T, <anonymous> >::borrow() const [with T = _object; void (* TC)(void*) = greenlet::refs::NoOpChecker]’ used but never defined [enabled by default] src/greenlet/greenlet_refs.hpp:191:19: warning: inline function ‘T* greenlet::refs::PyObjectPointer<T, <anonymous> >::operator->() const [with T = _object; void (* TC)(void*) = greenlet::refs::NoOpChecker]’ used but never defined [enabled by default] inline T* operator->() const G_NOEXCEPT ^ In file included from src/greenlet/greenlet_internal.hpp:20:0, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_greenlet.hpp:209:21: warning: inline function ‘bool greenlet::StackState::started() const’ used but never defined [enabled by default] inline bool started() const G_NOEXCEPT; ^ src/greenlet/greenlet_greenlet.hpp:211:21: warning: inline function ‘bool greenlet::StackState::active() const’ used but never defined [enabled by default] inline bool active() const G_NOEXCEPT; ^ src/greenlet/greenlet_greenlet.hpp:210:21: warning: inline function ‘bool greenlet::StackState::main() const’ used but never defined [enabled by default] inline bool main() const G_NOEXCEPT; ^ In file included from src/greenlet/greenlet_greenlet.hpp:11:0, from src/greenlet/greenlet_internal.hpp:20, from src/greenlet/greenlet.cpp:19: src/greenlet/greenlet_refs.hpp:181:19: warning: inline function ‘T* greenlet::refs::PyObjectPointer<T, <anonymous> >::borrow() const [with T = _greenlet; void (* TC)(void*) = greenlet::refs::GreenletChecker]’ used but never defined [enabled by default] inline T* borrow() const G_NOEXCEPT ^ error: command 'gcc' failed with exit status 1 ---------------------------------------- Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-30998ynj/greenlet/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-jfkgxde5-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-30998ynj/greenlet/ 还是报错,Python.h再文件夹中可以看到
最新发布
07-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IvanLJF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值