0

我想为全局变量提供一些外部参数。

我的实际代码是:

    static const char conn_str[] =
    "user='postgres' password='' host='127.0.0.1' port='5432' dbname='database'";
    
    pqxx::connection C(conn_str);
    pqxx::nontransaction N(C);

而且我希望能够使用 argv 参数提供代码,并且仍然使用连接 C 作为全局。

有什么想法吗?提前致谢...

所做的更改:

    //I initialized 
    static const char conn_str[][150]="";

    pqxx::connection* C(conn_str);
    pqxx::nontransaction* N(C);

    int main(int argc, char* argv[])
    {
    
    // code (....)
    
    database=argv[4];
    char data[]="dbname=%s user=postgres hostaddr=127.0.0.1 port=5432";
    sprintf(conn_str,database);
    C = new pqxx::connection(conn_str);
    N = new pqxx::nontransaction (C);

    OpenPSQL();
    LoadHeader ();
    LoadCustomers ();
    LoadProducts ();
    LoadTaxes ();
    
    // code
    
    delete C;  //dont forget to delete it when you are done
    delete N;  //dont forget to delete it when you are done
    }

我得到了这样的错误:

main.cpp:在函数 'void OpenPSQL()' 中:

main.cpp:268: 错误:在'C'中请求成员'is_open',它是非类类型'pqxx::connection*'</p>

4

2 回答 2

0

使用类似这样的指针:

static const char conn_str[];
pqxx::connection* C;

int main(int argc, char** argv)
{
   //... feed conn_str with argv here
   C = new pqxx::connection(conn_str);
   //... do whatever needs to be done
   delete C;  //dont forget to delete it when you are done
}
于 2015-05-22T09:03:19.070 回答
0

您已从对象更改为指针,因此如果您真的想采用这种方法,则C需要将成员访问从更改C.whatever为。C->whatever编译器抱怨您正在应用.而不是->指针。

更好的方法是将变量本身移动到main中,并通过引用任何需要它们的函数来传递它们。然后它们的生命周期被自动管理,并且依赖关系清晰可见。全局变量几乎从来都不是一个好主意。

此外,使用std::string而不是固定大小的缓冲区,这样如果命令行参数太长,您就不会出现溢出。

于 2015-05-22T10:24:02.050 回答