我正在开发一个用于解析配置 (.ini) 文件的 C 库,我计划将其与 Lazarus IDE 中创建的 UI 动态链接。目前,我的 C 代码严重依赖全局变量,如这个简化示例所示:
// Global variables in C
char nom_fichier_param[MAX_PATH_LENGTH];
char nom_fichier_parametre[MAX_NAME_LENGTH];
double temps_mesure, teta, pre_retard;
int filtre_tot, filtre_coinc;
void lecture_parametres(void) {
char s[MAX_LINE_LENGTH];
FILE *f;
int v_t;
int erreur;
CodeSortie = 0;
// Construct the full file path
snprintf(nom_fichier_param, sizeof(nom_fichier_param), "%s%s%s", chemin_param, nom_fichier_parametre, EXTENSION_PARAM);
f = fopen(nom_fichier_param, "r");
if (f == NULL) {
CodeSortie = 1;
return;
}
// Determine mode based on filename
mode = (strstr(nom_fichier_param, "A.ini") != NULL) ? 'A' : 'P';
// Skip the remaining 5 header lines
for (int l = 0; l < 5; l++) {
if (fgets(s, sizeof(s), f) == NULL) {
fprintf(stderr, "Unexpected end of file\n");
fclose(f);
CodeSortie = 1;
return;
}
}
// Process "temps_mesure"
//fgets(s, sizeof(s), f);
erreur = sscanf(DSp(trimRight(strncpy(s, s + 39, 40))), "%lf", &temps_mesure);
if (erreur == 0) {
printf("ERREUR format \"temps de mesure\"\n");
sortie(f);
return;
}
// ...
}
我担心这种方法可能会在动态链接过程中引起问题,特别是考虑到跨平台兼容性。 我的研究建议使用结构体而不是全局变量,但我不确定对 Lazarus 集成的影响。 问题:
我查看了 Lazarus wiki 上有关 FFI 的资源,但没有找到有关在动态链接的 C 库中处理全局状态的具体指南。 任何见解,尤其是那些具有涉及 C 和 Lazarus 的跨平台开发经验的见解,将不胜感激!
一些备注:
FPC 不依赖 (lib)FFI 与 C 对话,因为 Pascal 基本上与 C 处于同一水平,“只”需要匹配你在 C 中所做的一切的 pascal 声明。
有关更高级的问题列表,请参阅如何设计可在多种客户端语言中使用的 C / C++ 库?