user-0 提问: 如果C语言函数参数太多,可以怎么优化?

回复:
user: user-1
content: 参数的多少与你的问题的复杂度和解决问题的方式都有一定的关联。如果一个函数处理的问题所需要的参数就是那么多的话，就是合适的，不必修改。

user: user-2
content: 使用可变类型和数量的原型，类似于printf： int printf (const char *, ...);

user: user-3
content: c语言的参数 http://www.alex999.com/c_language_parameters.html

user: user-4
content: 七八个很好了。

user: user-5
content: 引用 11 楼 jiandingzhe 的回复:[quote=引用 10 楼 u012997273 的回复:] [quote=引用 9 楼 jiandingzhe 的回复:] [quote=引用 1 楼 xingat110 的回复:] 完全可以用结构体 我反对任意地组织结构体。结构体应当尽量表现业务上的逻辑关联性，而不是简单地用来减少参数数量。[/quote] 反对无效，要发对也要说个大家都同意的理由啊[/quote] 会增加类型的数量，而这个类型基本只在这一个函数有用。想象代码里充斥着“typedef struct XXXArgType”一类的玩意，我宁可多用几个参数。 而且楼主的七八个参数也不是很多。[/quote] 非常赞同

user: user-0
content: 引用 17 楼 starytx 的回复:结构体从技术上讲当然是可以的。但是一个函数参数这么多是否应该思考一下原因。同意9楼的观点，结构体应该是一组相关的数据组合，不是简单的为了减少参数个数而专门写一个结构体。其次，如果参数比较大，应该尽量用指针（如果只是输入，应该加const前缀）   函数实现的功能并不多,不过控制类的参数,和输出的参数有点多. 函数要实现打印明细的功能,根据个人账号,开始日期,截止日期查询,还需要用到文件指针,打印的是第几页,每页几条数据,当前页实际打印多少数据,是否全部打印.如果出错,需要把错误信息返回. 这就出现了很多的参数.

user: user-6
content: WIN32API参数也是众多。。

user: user-7
content: http://bbs.csdn.net/topics/390687008

user: user-7
content: http://bbs.csdn.net/topics/390682263

user: user-8
content: 引用 27 楼 u011688498 的回复:我说的是不要超过三个参数  做内核的吧？

user: user-9
content: 可能需要重构而不是优化.

user: user-10
content: 使用数组喽。你们看数组行不？

user: user-11
content: 结构体数组或者，分成几个函数来写，具体情况具体分析吧

user: user-9
content: 一般来说,参数过多的原因是函数功能不单一.   do one thing, and do it well

user: user-12
content: 来观摩观摩，学习学习

user: user-7
content: C/C++标准里面是否规定了函数参数个数最大值？ 急急如律令，请标准党现身——

user: user-13
content: 引用 32 楼 zhao4zhong1 的回复:刚发现cryptui.dll中的 LocalEnroll     LocalEnrollNoDS 多达23个参数！ 你赢了，把Msdn上的搞过来。在实际项目中，没有人写这么多

user: user-13
content: 其实可以采用不定参数。 结构体也行。

user: user-7
content: 刚发现cryptui.dll中的 LocalEnroll     LocalEnrollNoDS 多达23个参数！

user: user-7
content: 引用 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自己！ 谁不服？上！