Postgres ECPG:在 main() 之外添加一个函数会破坏程序

Postgres ECPG: adding a function outside main() breaks the program

我已经使用我的 C 应用程序成功连接并从 Postgresql 获取数据。我的 connector.pgc 文件如下所示:

#include <stdlib.h>
#include <stdio.h>
//#include "connect.h" // PROBLEM

int connect(); //NO PROBLEM

EXEC SQL BEGIN DECLARE SECTION;
    char dbname[1024];
    const char *target = "dbname@host:port";
    const char *user = "user";
    const char *passwd = "password";
EXEC SQL END DECLARE SECTION;

int main() {
    EXEC SQL CONNECT TO :target AS con1 USER :user USING :passwd;
    EXEC SQL SELECT pg_catalog.set_config('search_path', 'schema_name', false); EXEC SQL COMMIT;

    EXEC SQL SET CONNECTION con1;

    EXEC SQL SELECT current_database() INTO :dbname;
    printf("current database is '%s'\n", dbname);
    
    EXEC SQL DISCONNECT ALL;
    // connect();
    return 0;
}

// PROBLEM
//int connect(){
//    printf("A\n");
//    return 0;
//}

当然 username/password/schema_name/etc 除外。被替换为实际值。 然后我执行以下操作:

ecpg connector.pgc && gcc connector.c -o connectorXec -lecpg -L/usr/pgsql-12/lib && ./connectorXec

我的操作系统是默认的 CentOS 8。
ecpg --version returns ecpg (PostgreSQL) 13.2
psql --version returns psql (PostgreSQL) 12.8

程序编译正常,我可以毫无问题地连接,我知道这是 printf 提取正确的数据库名称,我也 运行 other SQL SELECTS确认数据。

然而,一旦我取消int connect()函数的注释,即使不使用它,它在实际程序之前被调用了3次,我不知道为什么。更准确地说,我看到字母 A 被打印了 3 次。此外,printf 不再显示正确的名称,而是 dbname 为空。

我试着把int connect()函数放到一个单独的connect.c文件中,然后通过connect.h把它和这个程序链接在一起,结果是一样的。

如果我将 main() 的内容放入 connect(),然后调用它,进程就会无限期地挂起。

真的,我很茫然,我根本不知道从哪里开始,因为这种情况似乎是不可能的。我检查了 ECPG 生成的 connector.c 文件,没有其他调用。我在网上可以找到的大多数参考文献都只包含 main() 函数,在极少数情况下它们不包含任何类似问题。

对发生的事情有什么想法吗?

好的,所以原来在某处使用了 connect() 函数,因为重命名它解决了问题。我在创建的 connector.c 文件中重命名它,这就是我错过这个明显解决方案的原因。

Laurenz Albe 说他自己试过了,一切正常,这意味着它在某种程度上对我的设置来说是独一无二的。