使用全局变量优化 C 库,以实现 Lazarus IDE 中的跨平台动态链接

问题描述 投票:0回答:1

我正在开发一个用于解析配置 (.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 集成的影响。 问题:

  1. 与 Lazarus 动态链接时,特别是跨不同平台时,在 C 库中使用全局变量有哪些潜在陷阱?
  2. 如何重构代码以使用结构或其他方法来确保更好的兼容性和可维护性?
  3. 考虑到 POSIX/XSI 可移植性标准,编写与 Lazarus 动态链接的 C 代码的最佳实践是什么?
  4. 如果我必须保留一些全局变量,我应该如何在 Lazarus 中声明和访问它们以确保正确链接?

我查看了 Lazarus wiki 上有关 FFI 的资源,但没有找到有关在动态链接的 C 库中处理全局状态的具体指南。 任何见解,尤其是那些具有涉及 C 和 Lazarus 的跨平台开发经验的见解,将不胜感激!

c cross-platform dynamic-linking freepascal lazarus
1个回答
0
投票

一些备注:

  • Lazarus 当然已经附带了一个可用的 INI 文件库。
  • 假设 GUI 应用程序有一个控制台(使用 snprintf)已经不可移植,例如Windows GUI 应用程序通常没有控制台。
  • 将全局变量捆绑在结构体中并不会从根本上改变全局变量的情况。它增加了对必须匹配的记录/结构打包的关注。
  • POSIX 标准在 Pascal 中几乎没有相关性,因为它们需要解析 C 标头,而 Pascal 显然不能。此外,FPC/Lazarus 是可移植的,并且可以在没有 POSIX 模拟层(如 cygwin/msys)的 Windows 上运行。
  • 全局变量应该起作用,请参阅https://www.freepascal.org/docs-html/3.2.0/prog/progsu148.html#x187-1900007.1.2。 但仅定义一些要设置/获取的函数以避免潜在的跨平台危险可能会更容易。

FPC 不依赖 (lib)FFI 与 C 对话,因为 Pascal 基本上与 C 处于同一水平,“只”需要匹配你在 C 中所做的一切的 pascal 声明。

有关更高级的问题列表,请参阅如何设计可在多种客户端语言中使用的 C / C++ 库?

© www.soinside.com 2019 - 2024. All rights reserved.