在C API上强制执行固定长度的字符串



我想对我的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

一种方法是通过

  1. 通过返回boolean来通知客户端他/她的呼叫是否成功
  2. 通过函数声明指示他必须给出一个参数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 

相关内容

最新更新