【问题标题】:How to make char array available in multiple .cpp files?如何使 char 数组在多个 .cpp 文件中可用?
【发布时间】:2015-12-18 10:49:19
【问题描述】:

我有一个工作程序,为了编辑,它必须分成多个部分。该程序需要将用户登录信息保存在 char 数组中以便能够连接到 SQL,并且此连接信息在程序的某些部分中多次使用,最终将在单独的 .cpp 文件中进行编译,这些文件将在单个程序中编译.

问题是,如果它们只在一个文件中声明,它们将在其余文件中丢失,如果它们在所有文件中声明,则会出现重复定义。

所以,举一个具体而简单的例子,如果我有以下代码:

#include <mysql++/mysql++.h>
#include <iostream>

using namespace std;
using namespace mysqlpp;

char server[]   =   "localhost";
char user[]     =   "root";
char pass[]     =   "xxxxxxx";
char db[]       =   "prog";

void function()
    {
    Connection con;
    con.connect("", server, user, pass);
    con.select_db(db);
    //action1...;
    }

void separated_function()
    {
    Connection con;
    con.connect("", server, user, pass);
    con.select_db(db);
    //action2...;
    }

int
main( int argc, char *argv[] )
{
    cout << "INICIO\n";

    function();
    separated_function();
    //something else with the mentioned variables...;
    
    cout << "FIN\n";
    return 0;
}

如何正确拆分,将function()another_function()main() 放在单独的.cpp 文件中,并使serveruserpassdb 可供所有人使用他们。

我知道一定有很多方法,但任何一种可行的方法都足够好,因为我到目前为止还没有得到任何结果。

注意:这个问题不是关于如何在 MySQL 中使用变量,而是关于如何正确拆分程序。

【问题讨论】:

  • sqlcon.server = "localhost"; 您不能在函数之外执行此操作。请张贴minimal reproducible example
  • 这就是问题所在?我正在尝试使用必须在函数内部的东西?
  • 这至少是我可以从您发布的代码中发现的一个明确问题。其余的什么都说不出来。另外char server[]; 可能有问题,我建议改用std::string
  • 这是我尝试使用的当前代码...您是否建议更好地将其从问题中删除?
  • 不,你应该发布一个最小的样本来重现你所有的错误,并逐字发布这些错误消息。

标签: c++ class scope global-variables


【解决方案1】:

您想在单独的源文件中使用extern,或者在单独的源文件中包含的公共标头中使用。您将在一个(并且只有一个)cpp 文件中定义它们。这是一个例子:

main.h

void function();
void seperated_function();

namespace myGlobals {
  extern char server[];
  extern char user[];
  extern char pass[];
  extern char db[];
}

main.cpp

#include <iostream>
#include "main.h"

namespace myGlobals {
  char server[] = "localhost";
  char user[] = "root";
  char pass[] = "xxxxxxx";
  char db[] = "prog";
}

int main(int argc, char *argv[]) {
  std::cout << "main.cpp\n";
  std::cout << myGlobals::server << "\n";
  std::cout << myGlobals::user << "\n";
  std::cout << myGlobals::pass << "\n";
  std::cout << myGlobals::db << "\n\n";
  function();
  seperated_function();
  return 0;
}

函数.cpp

#include <iostream>
#include "main.h"

void function() {
  std::cout << "function.cpp\n";
  std::cout << myGlobals::server << "\n";
  std::cout << myGlobals::user << "\n";
  std::cout << myGlobals::pass << "\n";
  std::cout << myGlobals::db << "\n\n";
}

separated_function.cpp

#include <iostream>
#include "main.h"

void seperated_function() {
  std::cout << "seperated function.cpp\n";
  std::cout << myGlobals::server << "\n";
  std::cout << myGlobals::user << "\n";
  std::cout << myGlobals::pass << "\n";
  std::cout << myGlobals::db << "\n\n";
}

namespace myGlobals 不是必需的,但如果我要使用全局变量,我至少喜欢将它们放在自己的命名空间中。

【讨论】:

  • 非常感谢,这是我所期待的答案 :) 。我将其改编为我的代码并且工作正常。
  • @Fahedsl 不客气。请接受此答案,因为它似乎为您提供了解决方案。
  • 而且它也适用于一些 GTK+ 变量。但是现在我真的很好奇@NeilKirk 所说的:“不要使用全局变量。将所需的状态放入结构或类中,并根据需要将其作为参数传递给函数。”
  • 是的,最好避免使用全局变量。我敢肯定,如果您搜索,您会发现很多关于该主题的讨论。
  • 您给出了明确的答案(我认为这是一个明确的问题),所以我邀请您阅读源自此的a new question。如果您觉得可行,请给出答案。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多