我有一个库函数,它接受一个level
参数,并使用它来索引参数值数组,我将其从函数的使用者中抽象出来。请注意,参数表,甚至其结构类型仅对包含它们的 C 文件可见。
图书馆.h
#define MIN_LEVEL 0
#define MAX_LEVEL ((sizeof(m_param_table)/sizeof(m_param_table[0]))-1)
BOOL set_param_level(int level);
图书馆.c
#include "library.h"
typedef struct {
int param1;
int param2;
} params_t;
// Parameters table - static (local) to this C file
static params_t m_param_table[] = {
{0, 1},
{2, 3},
};
BOOL set_param_level(int level) {
int p1, p2;
// bounds checking on MIN_LEVEL and MAX_LEVEL
if (level < MIN_LEVEL) return FALSE;
if (level > MAX_LEVEL) return FALSE;
p1 = m_param_table[level].param1;
p2 = m_param_table[level].param2;
// do stuff with p1, p2
return TRUE;
}
消费者.c
#include "library.h"
// Limit user input to MIN_LEVEL and MAX_LEVEL
set_param_level( user_input_value );
我希望 consumer.c 能够访问MIN_LEVEL
and MAX_LEVEL
,以进行用户输入验证。显然,他无权访问m_param_table
,因此这些宏不起作用。
最优雅和正确的方法是什么?选项是:
1) 移动typedef ... params_t
到头文件,并static
从m_params_table
. 显然我不喜欢这样,因为它使这些东西不必要地可见。
2) 硬编码头文件中的值。当然,硬编码值很糟糕。