C/C++可变参数
来源:互联网 发布:java 包命名特殊符合 编辑:程序博客网 时间:2024/04/30 04:13
★函数:
使用VA_LIST宏组解决变参问题
1、首先定义va_list型的变量,这个变量是指向参数的指针。
2、然后用va_start宏初始化刚定义的va_list变量,这个宏的第二个参数是“第一个可变参数的前一个参数”。
3、再用va_arg得到可变参数,第二个参数是“可变参数”的类型。
4、最后用va_end宏结束可变参数的获取。如果有多个可变参数,依次调用va_list获取各个参数。
- DWORD CHXVMSystem::RunFuncition( DWORD dwRunMode, // Run mode.
- LPCTSTR lpszFunctionName, // Function Name
- CVal * pvalResult, // Return.
- int nTakeParamsCount, // Count of Params
- ... ) // Params list
- {
- // Create Thread...
- CHXVMThread thread = m_pThreadManager->CreateThread( dwRunMode );
- LPVOID pStack = thread.GetStack();
- // Push Params
- va_list params;
- va_start( params, nTakeParamsCount );
- for( int i = 0; i < nTakeParamsCount; ++ i )
- (( CHXVMStack * ) pStack )->Push( * ( va_arg( params, CVal * )));
- va_end( params );
- (( CHXVMStack * ) pStack )->Push( CVal( nTakeParamsCount ));
- // Call..
- thread.SetEntry( lpszFunctionName );
- thread.BeiginRun();
- if( dwRunMode & HXVM_RUNMODE_SYNC )
- {
- WaitForSingleObject( thread.hThread, -1 );
- if( pvalResult )
- pvalResult = thread.GetExitCode();
- }
- return 0;
- }
使用VA_LIST应该注意的问题:
1、可变参数函数,必须通过某种方式事先预知传入参数的类型。可变参数函数的调用者,必须按照该方式传入对应类型的参数。一旦参数类型不匹配,将可能导致返回错误或无意义的数据,甚至栈被破坏。
2、编译器对可变参数的函数的原型检查不够严格,不利于写出高质量代码。在非必要情况下,应当尽量采用C++重载、多态等方式实现函数,而尽量不要使用可变参数。
★宏
宏也可以带可变参数,如:
#define PRINT( format, ... ) printf( format, ## __VA_ARGS__ );
“##”不可以省略,如果省略,就不可以省略可变参数部分。比如:“PINTF("hello");”,无可变参数部分,解释PRINT宏时就会多出一个“,”号,导致编译出错。
或者可以这样定义:
#define PRINT( format, args... ) printf( format, ##agrs );
- c可变函数参数
- C可变参数宏
- c语言可变参数
- C可变参数函数
- C/C++可变参数
- C 可变参数
- C语言可变参数
- C语言可变参数
- C语言可变参数
- C宏 可变参数
- c可变参数研究
- C可变参数
- C可变参数个数
- C中的可变参数
- C可变参数详解
- 可变参数宏.c
- C中的可变参数
- c语言可变参数
- kvm环境创建虚拟机
- wxWidgets中不断重绘矩形的方法
- Linux 套接字编程中的 5 个隐患
- C#中76个关键字统计
- image load
- C/C++可变参数
- C++调用C函数
- 正则表达式顺口溜
- QTableWidget的用法总结
- Linux SD驱动分析
- ndk make: *** 没有规则可以创建
- 问自己
- 程序员有趣的面试智力题
- Android的设计范:Feel_UX让你不再仰望iPhone(视频+图)