我想对我的API函数强制使用固定长度的字符串。因此,我通过函数签名通知客户端这一点。
我没有定义一个简单的"char*"字符串,而是定义了一个带有单个字段的结构,该字段是固定长度的字符串作为输入。此参数是客户端负责的输出参数。
这是一个描述我所做的示例代码:
#define STR_LEN 64
struct buf {
char str[STR_LEN];
}
void calc_str(struct buf * b);
这是使用固定长度字符串参数强制客户端的一种可接受的方式吗?
添加到@Ian的答案中,您可以在API中提供不透明的结构:
struct you_cant_see_inside_me;
不要在API中提供结构的内部-隐藏结构定义:
在api.h
:中
struct you_cant_see_inside_me;
struct you_cant_see_inside_me *createStruct( const char *data );
freeStruct( struct you_cant_see_inside_me *s );
int yourAPIcall( struct you_cant_see_inside_me *s );
在你的代码中,你不会分发:
struct you_cant_see_inside_me
{
char data[ 64 ];
};
struct you_cant_see_inside_me *createStruct( const char *data )
{
struct you_cant_see_inside_me *s = malloc( sizeof( *s ) );
// copy data to your satisfaction here, return NULL if
// you don't like what you've been passed - you can set
// errno to EINVAL to indicate invalid arguments
return( s );
}
freeStruct( struct you_cant_see_inside_me *s )
{
free( s );
}
您仍然存在拒绝不符合您的标准的输入的问题。
下面是一个简单示例的链接:http://c-faq.com/struct/sd1.html
一种方法是通过
- 通过返回
boolean
来通知客户端他/她的呼叫是否成功 - 通过函数声明指示他必须给出一个参数
varSize
例如,在C中,你可以做一些类似的事情
//gives char return, and varSize input, the output here would be *myStruct
char createStruct (MyStruct* myStruct, int varSize){
if (varSize != STR_LEN)
return 0; //zero indicating false
//length is acceptable, do something else
return 1; //return this when everything is okay
}
是的,您可以定义宏并使用固定长度的字符串。
定义宏更简单的方法是在头文件中定义宏,并在其中使用保护程序。例如,我们有头测试.h
如果STR_LEN未定义,则将对其进行定义,如果已定义,则在链接时不会出现多重定义。
#ifndef STR_LEN
#define STR_LEN 64
#endif