我有一個庫函數,它只需要一個level
參數,並使用它來索引一個參數值數組,並將其從函數的使用者中抽象出來。請注意,參數表,甚至其結構類型僅對其包含的C文件可見。如何根據表的大小導出常量
library.h
#define MIN_LEVEL 0
#define MAX_LEVEL ((sizeof(m_param_table)/sizeof(m_param_table[0]))-1)
BOOL set_param_level(int level);
LIBRARY.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;
}
consumer.c
#include "library.h"
// Limit user input to MIN_LEVEL and MAX_LEVEL
set_param_level(user_input_value);
我想利弊umer.c能夠訪問MIN_LEVEL
和MAX_LEVEL
,以進行用戶輸入驗證。顯然,他沒有訪問m_param_table
,所以這些宏不起作用。
什麼是最優雅的正確的方式來做到這一點?選項有:
1)移動typedef ... params_t
到一個頭文件,和從m_params_table
除去static
。很顯然,我不喜歡這樣做,因爲它會讓這些東西不必要地被看到。
2)對頭文件中的值進行硬編碼。當然,硬編碼值很吸引人。
我的第一個反應是在頭文件中使用'extern size_t MAX_LEVEL;',並在表格後的.c文件中將其定義爲一個變量,但我猜你已經想到了它。 – WhozCraig
@WhozCraig而且它不是隻讀的... –
無可否認,我還沒有嘗試過,懷疑我即將受到教育,但extern const size_t ...在decl和const size_t ...上高清?如果這是一個標準符號導出'_MAX_LEVEL',後者將只爲您的libs帶來好處,但至少頭文件中的decl仍會爲消費者端限制聲明'const'。 – WhozCraig