如果C语言函数参数太多,可以怎么优化?

luoyihu 2014-01-06 03:24:20
如题,如果函数参数太多,有七八个甚至更过,可以怎么优化一下?使用结构体传参行吗?
...全文
4746 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
星光伴月 2015-05-08
  • 打赏
  • 举报
回复
参数的多少与你的问题的复杂度和解决问题的方式都有一定的关联。如果一个函数处理的问题所需要的参数就是那么多的话,就是合适的,不必修改。
均陵鼠侠 2015-05-07
  • 打赏
  • 举报
回复
使用可变类型和数量的原型,类似于printf:
int printf (const char *, ...);
kanhuijiji 2015-05-07
  • 打赏
  • 举报
回复
c语言的参数 http://www.alex999.com/c_language_parameters.html
chuchenghao1989 2014-01-24
  • 打赏
  • 举报
回复
七八个很好了。
lost11-30 2014-01-22
  • 打赏
  • 举报
回复
引用 11 楼 jiandingzhe 的回复:
[quote=引用 10 楼 u012997273 的回复:] [quote=引用 9 楼 jiandingzhe 的回复:] [quote=引用 1 楼 xingat110 的回复:] 完全可以用结构体
我反对任意地组织结构体。结构体应当尽量表现业务上的逻辑关联性,而不是简单地用来减少参数数量。[/quote] 反对无效,要发对也要说个大家都同意的理由啊[/quote] 会增加类型的数量,而这个类型基本只在这一个函数有用。想象代码里充斥着“typedef struct XXXArgType”一类的玩意,我宁可多用几个参数。 而且楼主的七八个参数也不是很多。[/quote] 非常赞同
luoyihu 2014-01-13
  • 打赏
  • 举报
回复
引用 17 楼 starytx 的回复:
结构体从技术上讲当然是可以的。但是一个函数参数这么多是否应该思考一下原因。同意9楼的观点,结构体应该是一组相关的数据组合,不是简单的为了减少参数个数而专门写一个结构体。其次,如果参数比较大,应该尽量用指针(如果只是输入,应该加const前缀)
函数实现的功能并不多,不过控制类的参数,和输出的参数有点多. 函数要实现打印明细的功能,根据个人账号,开始日期,截止日期查询,还需要用到文件指针,打印的是第几页,每页几条数据,当前页实际打印多少数据,是否全部打印.如果出错,需要把错误信息返回. 这就出现了很多的参数.
YunShell 2014-01-10
  • 打赏
  • 举报
回复
WIN32API参数也是众多。。
赵4老师 2014-01-10
  • 打赏
  • 举报
回复
赵4老师 2014-01-10
  • 打赏
  • 举报
回复
aozhi 2014-01-09
  • 打赏
  • 举报
回复
引用 27 楼 u011688498 的回复:
我说的是不要超过三个参数
做内核的吧?
mujiok2003 2014-01-09
  • 打赏
  • 举报
回复
可能需要重构而不是优化.
chinmusam 2014-01-09
  • 打赏
  • 举报
回复
使用数组喽。你们看数组行不?
独孤九剑贰 2014-01-09
  • 打赏
  • 举报
回复
结构体数组或者,分成几个函数来写,具体情况具体分析吧
mujiok2003 2014-01-09
  • 打赏
  • 举报
回复
一般来说,参数过多的原因是函数功能不单一. do one thing, and do it well
这人不靠谱 2014-01-09
  • 打赏
  • 举报
回复
来观摩观摩,学习学习
赵4老师 2014-01-09
  • 打赏
  • 举报
回复
C/C++标准里面是否规定了函数参数个数最大值? 急急如律令,请标准党现身——
漫步者、 2014-01-09
  • 打赏
  • 举报
回复
引用 32 楼 zhao4zhong1 的回复:
刚发现cryptui.dll中的 LocalEnroll LocalEnrollNoDS 多达23个参数!
你赢了,把Msdn上的搞过来。在实际项目中,没有人写这么多
漫步者、 2014-01-09
  • 打赏
  • 举报
回复
其实可以采用不定参数。 结构体也行。
赵4老师 2014-01-09
  • 打赏
  • 举报
回复
刚发现cryptui.dll中的 LocalEnroll LocalEnrollNoDS 多达23个参数!
赵4老师 2014-01-09
  • 打赏
  • 举报
回复
引用 24 楼 zhao4zhong1 的回复:
有谁统计过Windows API中哪个函数的参数最多? 有比 BOOL CreateProcessAsUser( HANDLE hToken, // handle to a token representing the logged-on user LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes BOOL bInheritHandles, // whether new process inherits handles DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION ); 还多的吗?
AccessCheckByTypeResultListAndAuditAlarmByHandle Function The AccessCheckByTypeResultListAndAuditAlarmByHandle function determines whether a security descriptor grants a specified set of access rights to the client that the calling thread is impersonating. The difference between this function and AccessCheckByTypeResultListAndAuditAlarm is that this function allows the calling thread to perform the access check before impersonating the client. The function can check access to a hierarchy of objects, such as an object, its property sets, and properties. The function reports the access rights granted or denied to each object type in the hierarchy. If the security descriptor has a system access control list (SACL) with access control entries (ACEs) that apply to the client, the function generates any necessary audit messages in the security event log. Alarms are not currently supported. BOOL WINAPI AccessCheckByTypeResultListAndAuditAlarmByHandle( __in LPCTSTR SubsystemName, __in LPVOID HandleId, __in HANDLE ClientToken, __in LPCTSTR ObjectTypeName, __in_opt LPCTSTR ObjectName, __in PSECURITY_DESCRIPTOR pSecurityDescriptor, __in_opt PSID PrincipalSelfSid, __in DWORD DesiredAccess, __in AUDIT_EVENT_TYPE AuditType, __in DWORD Flags, __in_out_opt POBJECT_TYPE_LIST ObjectTypeList, __in DWORD ObjectTypeListLength, __in PGENERIC_MAPPING GenericMapping, __in BOOL ObjectCreation, __out LPDWORD GrantedAccess, __out LPDWORD AccessStatusList, __out LPBOOL pfGenerateOnClose ); 自己PK自己! 谁不服?上!
加载更多回复(29)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧