c ++将函数放在单独的源文件中

时间:2016-05-30 14:47:39

标签: c++ function

目前我有一个独特的源文件(* .cpp),我的所有功能都正常工作。现在我试图把它们中的一些放到单独的源文件中,并将它们包含在主要来源中,但没有成功。

我目前的项目如下:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
#define _SQLNCLI_ODBC_
#include <sqlext.h>
#include <sqlncli.h>

using namespace std;
using std::cout;
using std::ifstream;


/*This is one of the functions to be put in separate file:*/
string *ReadPageAsignations ( const char* RutayNombre, const char* Page )
{
bool MisionCumplida = false;
bool EncabezadoListo = false;
int i = 0;
int j = 0;
char * pch;
char istr[256];
const int NUM_DATA = 15;    
static string data[NUM_DATA];
std::stringstream InputString;
ifstream inputFile(RutayNombre); 

if (inputFile.is_open())        
  {
  while (inputFile.good() && MisionCumplida == false)
    {
        i = 0;
        inputFile.getline(istr,256);
        pch = strtok (istr,":");
        if (string(pch) == "[Pagina]")
        {
            EncabezadoListo = true;
        }
        else
        {
            EncabezadoListo = false;
        }
        if (string(pch) == Page)
        {
            MisionCumplida = true;
        }
        while (pch != NULL)
            {
                if ((EncabezadoListo == true) || (MisionCumplida == true))
                {
                    data[i] = data[i] + " " + string(pch);
                }
                pch = strtok (NULL, ",");
                i++;
            }
    }
    inputFile.close();
    return data;
  }
} //End of function 'ReadPageAsignations'

/*This is another function where my function "ReadPageAsignations' get called -- btw, I want also this function to be in a separate source file.*/
void DeliverHtml (const char* page){//const char* RutayNombre ) {
  string *p;
  char * pch;
  size_t pos;
  string RutayNombre;
RutayNombre = "../Substructure/Templates/" + SearchConfigValue( "../Substructure/Conf/Config-Templates.txt", "htmlTemplate:");
const char *RutayNombreConfigCompos = "../Substructure/Conf/Config-Composition.txt";
  string RutayNombreParaInsertar;
  string token, token1, token2;
  string line, lineRead, lineToInsert;
  char * StrToTokenize2;
  string StrToTokenize1;
p=ReadPageAsignations( RutayNombreConfigCompos, page); //Here, I call the function I want in a separate file
...
}

/*And here is the main() function*/
int main()
{
char *value = "page=Home";
    if (NULL!=strstr(getenv("QUERY_STRING"), "page="))
    {
        value = getenv("QUERY_STRING");
    }


  char *posCh = strstr(value, "=");

    DeliverHtml(&posCh[0]+1);
return 0;
}

对于第一个函数,我尝试创建头文件'ReadPageAsignations.h'和源文件'ReadPageAsignations.cpp'。

头文件'ReadPageAsignations.h'包含:

#ifndef READPAGEASIGNATIONS_H_INCLUDED
#define READPAGEASIGNATIONS_H_INCLUDED

string *ReadPageAsignations ( const char* RutayNombre, const char* Page );

#endif // READPAGEASSIGNATIONS_H_INCLUDED

源文件'ReadPageAsignations.cpp',用于包含以下内容的单独函数:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>


using namespace std;
using std::cout;
using std::ifstream;

string *ReadPageAsignations ( const char* RutayNombre, const char* Page )
{
bool MisionCumplida = false;
bool EncabezadoListo = false;
int i = 0;
int j = 0;
char * pch;
char istr[256];
const int NUM_DATA = 15;    /*El numero de elementos debe coincidir con el iterador en la función Deliverhtml.*/
static string data[NUM_DATA];
std::stringstream InputString;
ifstream inputFile(RutayNombre); //Abre el archivo y lo asigna al stream inputFile.

if (inputFile.is_open())        //Chequea que el archivo esté abierto.
  {
  while (inputFile.good() && MisionCumplida == false)
    {
        i = 0;
        inputFile.getline(istr,256);
        pch = strtok (istr,":");
        if (string(pch) == "[Pagina]")
        {
            EncabezadoListo = true;
        }
        else
        {
            EncabezadoListo = false;
        }
        if (string(pch) == Page)
        {
            MisionCumplida = true;
        }
        while (pch != NULL)
            {
                if ((EncabezadoListo == true) || (MisionCumplida == true))
                {
                    data[i] = data[i] + " " + string(pch);
                }
                pch = strtok (NULL, ",");
                i++;
            }
    }
    inputFile.close();
    return data;
  }
} //End function

,主要项目包含:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
#define _SQLNCLI_ODBC_
#include <sqlext.h>
#include <sqlncli.h>

#include "ReadPageAsignations.h" //Here I #include the function definition file (header)

using namespace std;
using std::cout;
using std::ifstream;
...
}

我有很多编译错误:

\ReadPageAsignations.h|4|error C2143: syntax error : missing ';' before '*'|
\ReadPageAsignations.h|4|error C4430: missing type specifier - int assumed. Note: C++ does not support default-int|
\ReadPageAsignations.h|4|error C4430: missing type specifier - int assumed. Note: C++ does not support default-int|
main.cpp|20|error C2872: 'string' : ambiguous symbol|
...

我正在使用MS Visual C ++ 2005/2008编译器编写Code :: blocks 13.12。

任何帮助都将受到高度赞赏,提前谢谢。

2 个答案:

答案 0 :(得分:1)

错误告诉您,当它尝试解析头文件时,它遇到符号string并且无法识别它。将#include <string>添加到您的头文件并将string类型完全限定为std::string可以解决问题。

答案 1 :(得分:0)

您应该将#include <string>放入头文件并将其从.cpp文件中删除

如下:

的main.cpp

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <windows.h>
#define _SQLNCLI_ODBC_
#include <sqlext.h>
#include <sqlncli.h>
#include "ReadPageAsignations.h"
...

注意:包括同名.cpp文件的头文件,包括两者。

ReadPageAsignations.h

#ifndef READPAGEASIGNATIONS_H_INCLUDED
#define READPAGEASIGNATIONS_H_INCLUDED
#include <string>        //<-----This line, include string header

std::string *ReadPageAsignations ( const char* RutayNombre, const char* Page );

#endif // READPAGEASSIGNATIONS_H_INCLUDED

ReadPageAsignations.cpp

#include <iostream>
#include <fstream>
#include <sstream>
#include "ReadPageAsignations.h"  // <--- add the header file here
//#include <string>   <---remove it already included in the header file


using namespace std;
//using std::cout;  <--remove this you already used namespace std
//using std::ifstream;  <--remove this you already used namespace std

string *ReadPageAsignations ( const char* RutayNombre, const char* Page )
{

... } //End function