如何提高代码可读性?

时间:2014-07-01 14:09:46

标签: c winsock

我知道函数send()通过winsocket的payoload是一个指向char数组的指针,我想用它来发送一组固定值,我想写这样的东西< / p>

send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE), 0);

同时,对于可读性和manteinance设置这对夫妇(名字,价值)的方式或类似(认为它是伪代码)会很舒适:

FIXED_VALUE_1 <- 1
FIXED_VALUE_2 <- 2
FIXED_VALUE_3 <- 3
...

我可以用什么?我已经放弃了枚举,因为它们是整数,我认为浪费四个发送每个字节一个字节。另一种方法是定义一个宏,但我不能为一个字节而不仅仅是一个字符串定义一个宏,因为我想发送'27',而不是'2','7'。

提前致谢。

2 个答案:

答案 0 :(得分:4)

首先,请注意,如上所述,

send(socket, FIXED_VALUE_N, (int)strnlen(FIXED_VALUE_N), 0);  
                                                    ^^ //added to correct typo

FIXED_VALUE_N必须采用const char *的形式才能正确。并且,strnlen()需要两个参数,(第二个是size_t number_of_elements)。

编辑3 (解决最新评论问题)

如果您将FIXED_VALUE_N声明并填充为:

const char FIXED_VALUE_N[2];
FIXED_VALUE_N[0]=0x1B;  

除了纠正第三个参数的语法......

send(socket, FIXED_VALUE_N, 1, 0); //hard-coded third argument for illustration  

...它会起作用,因为你现在在第二个参数中传递一个指向const char(const char *)的指针,并且遵守send()原型的语法要求。
(结束编辑3)

考虑到这一点,您是否考虑将数据字符串连接成逗号分隔的组?这将允许发送多个值,并在接收端进行解析。例如:

#define MAX_SIZE 100 //pick a value that makes sense for your application, I randomly picked 100
char buffer[MAX_SIZE];
int len=0;

sprintf(buffer, "%d,%d,%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
len = strlen(buffer); //****
send(socket, buffer, len + 1, 0);  // strlen() does not include `\0` byte in its return
                                   // value.  Use `len +1` to make room for 
                                   // \0 terminator - added by the sprintf() function.

会发送"1,2,3"

关于你的陈述:因为我想发送'27'而不是'2','7'。

将逗号保留在格式sprintf()语句之外,您发送的号码将是连续的。

sprintf(buffer, "%d%d%d", FIXED_VALUE_1, FIXED_VALUE_2,FIXED_VALUE_3);
                 ^^^^^^  

会发送"123"

编辑 (使用sprintf的返回填充len)
另外,正如@Jack所指出的那样:
您可以通过简单地设置len = sprintf(...)来保存一行代码,而不是使用strlen();在上面的行。 (请参阅上面代码段中的****) 如果发生输出错误,sprintf()将返回传输的字符数或负值。 (如果输出为负,则发生错误)

编辑2 (字节数据,根据您的评论)

如果要以最小(最有效)的形状因子发送数据,请使用字节数据。字节数据可以存储在char数组中:

char *byte_data=0;

byte_data = malloc(NUM_BYTES_RQD);//#define NUM_BYTES_RQD as needed, 
                                  //or pass in size info as an argument 
                                  //from calling function  

//populate byte_data

for(i=0;<NUM_BYTES_RQD;i++)
{
    byte_data[i]=<enter byte value here>
}
send(socket, byte_data, len, 0);  
free(byte_data);

答案 1 :(得分:2)

您是否考虑过使用the X macro?

#define X(a, b) a,

#define FIXED_VALUES_TABLE
X(FIXED_VALUE_1, "1") \
X(FIXED_VALUE_2, "2") \
// ...

enum { FIXED_VALUES_TABLE };
#undef x

#define X(a, b) b,
const char *fixed_values_values[] = { FIXED_VALUES_TABLE };
#undef x

然后你就可以这样使用:

char *val = fixed_values_values[FIXED_VALUE_1];
char *va2 = fixed_values_values[FIXED_VALUE_2];

如果要连接它们,可以使用malloc()+strcat()