没发现比较合意的现成实现,自己山寨了一个,Windows Only,代码刷屏,非礼勿视。
头文件
#ifndef CONFIG_H
#define CONFIG_H
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
typedef struct config_binding_a{
char* section;
char* key;
void** val;
void* def;
int type;
}CONFIG_BINDING_A, *PCONFIG_BINDING_A;
typedef struct config_binding_w{
wchar_t* section;
wchar_t* key;
void** val;
void* def;
int type;
}CONFIG_BINDING_W, *PCONFIG_BINDING_W;
extern BOOL config_load_a(HMODULE module,CONFIG_BINDING_A* binding);
extern BOOL config_load_w(HMODULE module,CONFIG_BINDING_W* binding);
#define CONFIG_TYPE_INT 1
#define CONFIG_TYPE_STRING 0
#ifdef UNICODE
#define CONFIG_BINDING CONFIG_BINDING_W
#define CONFIG_BINDINGS CONFIG_BINDINGS_W
#define config_load config_load_w
#else
#define CONFIG_BINDING CONFIG_BINDING_A
#define CONFIG_BINDINGS CONFIG_BINDINGS_A
#define config_load config_load_a
#endif
#ifdef __cplusplus
}
#endif //__cplusplus
#endif
实现代码
#include <config.h>
BOOL config_load_a(HMODULE module,CONFIG_BINDING_A* binding){
char path[MAX_PATH];
GetModuleFileNameA(module,path,MAX_PATH);
for(int i=strlen(path)-1;i>=0;i--){
if(path[i]=='\\'){
path[i]='\0';
break;
}
}
strcat(path,"\\config.ini");
PCONFIG_BINDING_A b;
int i=0;
char buffer[32767];
int l;
while((b=binding+(i++))->section){
switch(b->type){
case CONFIG_TYPE_STRING:
l = GetPrivateProfileStringA(b->section,b->key,(char*)b->def,buffer,32767,path);
if(buffer[0]==0&&b->def==NULL){
*(b->val)=NULL;
}else{
*(b->val)=malloc(sizeof(char)*strlen(buffer));
strcpy((char*)*(b->val),buffer);
}
break;
case CONFIG_TYPE_INT:
*((int*)(b->val)) = GetPrivateProfileIntA(b->section,b->key,(int)b->def,path);
break;
}
}
return TRUE;
}
BOOL config_load_w(HMODULE module,CONFIG_BINDING_W* binding){
wchar_t path[MAX_PATH];
GetModuleFileNameW(module,path,MAX_PATH);
for(int i=wcslen(path)-1;i>=0;i--){
if(path[i]==L'\\'){
path[i]=L'\0';
break;
}
}
wcscat(path,L"\\config.ini");
PCONFIG_BINDING_W b;
int i=0;
wchar_t buffer[32767];
int l;
while((b=binding+(i++))->section){
switch(b->type){
case CONFIG_TYPE_STRING:
l = GetPrivateProfileStringW(b->section,b->key,(wchar_t*)b->def,buffer,32767,path);
if(buffer[0]==0&&b->def==NULL){
*(b->val)=NULL;
}else{
*(b->val)=malloc(sizeof(wchar_t)*wcslen(buffer));
wcscpy((wchar_t*)*(b->val),buffer);
}
break;
case CONFIG_TYPE_INT:
*((int*)b->val) = GetPrivateProfileIntW(b->section,b->key,(int)b->def,path);
break;
}
}
return TRUE;
}
示例代码
#include "config.h"
char* db_host, *db_user, *db_pass, *db_name;
int db_port;
CONFIG_BINDING_A bindings[] = {
{"db","host",(void**)&db_host},
{"db","user",(void**)&db_user},
{"db","pass",(void**)&db_pass},
{"db","name",(void**)&db_name},
{"db","port",(void**)&db_port,(void*)3306,CONFIG_TYPE_INT},
NULL,
}
int _tmain(int argc, _TCHAR* argv[])
{
config_load_a(GetModuleHandle(NULL),bindings);
printf("mysql://%s:%d/%s;user=%s;pass=%s\n",db_host,db_port,db_name,db_user,db_pass);
}

Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4
阅
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7
阅 2