优化/更好的编码函数和使用其返回值的方法

时间:2013-01-09 06:59:31

标签: c optimization

我有20到30个函数,我必须在函数中调用wsse_authenticate,而这个wsse_authenticate函数返回一个基于该值的值我发送错误消息,有什么方法可以改进这个代码,所以我只是在每个函数中调用函数wsse_authenticate(soap),然后用一些更好的代码替换switch开关,我想让它更有效率,请给我一些输入

wsse_ret = (wsse_authenticate(soap));

if(wsse_ret)
{
    switch(wsse_ret)
    {
        case 1: onvif_fault(soap,"ter:NoSecuritytoken","ter:Failed_wsse_Aunthentication");

        case 2: onvif_fault(soap,"ter:InvalidUserName","ter:FailedAunthentication");

        case 3: onvif_fault(soap,"ter:InvalidPassword","ter:FailedAunthentication");

    }
}

2 个答案:

答案 0 :(得分:2)

从上面的代码中,我看到你正在为函数 onvif_fault 作为参数传递的“失败消息”所期望的所有情况调用相同的函数。并且在每个案例陈述之后也没有中断,这不会给你预期的结果。

使用break语句的说明: 假设ret值为1,则由于末尾有break语句,因此将执行所有三种情况。这意味着 onvif_fault 将使用不同的参数调用三次。

您的问题解决方案 您可以使用c中的结构创建一个表,该结构实际​​上包含故障列表 这是你可以用一行代码替换你的Switch语句。

EX:
    typedef struct _fault_messages
    {
        char msg1 [254];
        char msg2 [254];
    } fault_messages;

fault_messages msg_table[3] = {  
                    {"ter:NoSecuritytoken", "ter:Failed_wsse_Aunthentication"},  
                    {"ter:error1", "ter:fault1"},  
                    {"ter:error2", "ter:fault2"}  

};

现在,映射上表中的错误消息。您可以按照以下说明优化代码:

wsse_ret = (wsse_authenticate(soap));  

if(wsse_ret)  
{  
    onvif_fault(soap, msg_table[wsse_ret-1].msg1, msg_table[wsse_ret-1].msg2);  
}

答案 1 :(得分:1)

如果我理解正确 - 你的主要问题是你不想在30个函数集中的每个函数中重复安全检查代码:-) 如果是这种情况,您可以尝试使用这种模式:

#include <stdio.h>
#include <string.h>

int isUserPasswordValid(char * password) {
    return strcmp(password, "MyBigPassword") == 0;
}

#define callFunctionWithAuthentication(password, secPayload, execPayload) \
do {\
   if (!isUserPasswordValid(password)) {\
      secPayload\
   }\
   else {\
      execPayload\
   }\
} while(0);

int myTestFunction(int x) {
    return x;
}

int main(int argc,char* argv[]){

   // bad password - executes only authentication
   callFunctionWithAuthentication(
               "randomPassword",
               printf("oops - bad password - can't continue\n");,
               int a = myTestFunction(10); printf("function returned %d\n",a);)

   // good password - executes authentication AND code after
   callFunctionWithAuthentication(
               "MyBigPassword",
               printf("oops - bad password - can't continue\n");,
               int a = myTestFunction(10); printf("function returned %d\n",a);)

   return 0;
}

唯一的缺点是你必须将每个30函数的调用替换为callFunctionWithAuthentication的调用。但这是一次性的任务。此外,您必须始终调用此宏而不是plain函数。