在工程中包含两个cpp文件(只有一个有main),那这段程序是怎样运行的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在工程中包含两个cpp文件(只有一个有main),那这段程序是怎样运行的?相关的知识,希望对你有一定的参考价值。

还有,为什么规定工程中能有两个cpp,如果是相互引用的话用**.h 不就行了吗,两个cpp就几个有什么意义,,,

1、首先写一个简单的cpp程序,这里用的vim。

2、写好之后,保存退出;vim输入[:wq],回车,保存退出。

3、然后,使用命令[ls],可以看到自己刚才写的cpp文件。

4、如果之前在Linux下写过C程序,可以知道编译C程序用的命令是[gcc hello.c -o hello]。

5、然后再用[ls]命令,查看编译出来的可执行文件。

6、最后使用命令[./hello],运行程序就完成了。

参考技术A 相互引用的只能是头文件,也就是你所说的.h,一个工程中只能有一个main函数,可以有多个cpp,可以为自己写的每个类写一个单独的cpp文件,其实也是可以直接写在main函数里的,但是分开成多个cpp只要是为了程序的可读性,能够让其他人也能很快的知道你写的代码是要干嘛的追问

那写了其它的cpp,引用其中的函数时还加不加声明#include

本回答被提问者和网友采纳
参考技术B 我猜你现在学的是C++,首先必须有一个主函数main,cpp指的是文件扩展名,另外文件有.h和.cpp是类的定义和实现,在cpp文件必须加上.h头文件,而不是.cpp. 参考技术C 你创建新文件时没有把文件包含到编译目录中。项目属性中设置一下,把它包含进去就行了。

如何在除 main.cpp 之外的其他文件中包含 OTL 标头?

【中文标题】如何在除 main.cpp 之外的其他文件中包含 OTL 标头?【英文标题】:How to include the OTL header in other files besides main.cpp? 【发布时间】:2016-09-03 03:39:57 【问题描述】:

我在我的项目中使用 OTL。 以下代码按预期工作:

#include <iostream>
using namespace std;
#include <stdio.h>
#define OTL_ODBC // CompileOTL 4.0/ODBC
// Thefollowing #define is required with MyODBC 5.1 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
#define OTL_UNICODE // CompileOTL with Unicode
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file
otl_connect db; // connect object
void insert()
// insert rowsinto table

    otl_stream o(1, //buffer size should be == 1 always on INSERT.
        "insert into test_tab values(:f1<int>,:f2<char[5]>)",
        // SQLstatement, char[5] means 5 2-byte
        // Unicodecharatcters including a null
        // terminator
        db // connectobject
    );
    unsigned short tmp[32]; // Nullterminated Unicode character array.
    for(int i = 1; i <= 100; ++i)
    
        o << i;
        tmp[0] = 1111; //Unicode character (decimal code of 1111)
        tmp[1] = 2222; //Unicode character (decimal code of 2222)
        tmp[2] = 3333; //Unicode chracater (decimal code of 3333)
        tmp[3] = 4444; //Unicode chracater (decimal code of 4444)
        tmp[4] = 0; //Unicode null terminator
        o << (unsigned char*)tmp;
        // overloadedoperator<<(const unsigned char*) in the case of Unicode
        // OTL acceptsa pointer to a Unicode character array.
        //operator<<(const unsigned short*) wasn't overloaded
        // in order toavoid ambiguity in C++ type casting.
    


void select()

    otl_stream i(50, //buffer size
        " select* from test_tab "
        "where f1>= :f11<int> "
        "  and f1 <= :f12<int>*2 ",
        // SELECTstatement
        db // connectobject
        );
    // create selectstream
    int f1;
    unsigned short f2[32];
    i << 8 << 8; // assigning :f11 = 8, f12 = 8
                 // SELECTautomatically executes when all input variables are
                 // assigned. Firstportion of output rows is fetched to the buffer
    while(!i.eof())
    // while not end-of-data
        i >> f1;
        i >> (unsigned char*)f2;
        // overloaded operator>>(unsignedchar*) in the case of Unicode
        // OTL acceptsa pointer to a Unicode chracter array.
        //operator>>(unsigned short*) wasn't overloaded
        // in order toavoid ambiguity in C++ type casting.
        cout << "f1=" << f1 << ", f2=";
        for(int j = 0; f2[j] != 0; ++j)
            cout << "" << f2[j];
        cout << endl;
    
    i << 4 << 4; // assigning :f11 = 4, :f12 = 4
                 // SELECTautomatically executes when all input variables are
                 // assigned. Firstportion of output rows is fetched to the buffer
    while(!i.eof())
    // while not end-of-data
        i >> f1 >> (unsigned char*)f2;
        cout << "f1=" << f1 << ", f2=";
        for(int j = 0; f2[j] != 0; ++j)
            cout << "" << f2[j];
        cout << endl;
    


int main()

    otl_connect::otl_initialize(); // initialize the database API environment
    try
    
        db.rlogon("root/123456@rhctp");
        otl_cursor::direct_exec(
            db,
            "drop table test_tab",
            otl_exception::disabled // disable OTL exceptions
        ); // droptable
        otl_cursor::direct_exec(
            db,
            "create table test_tab(f1 int, f2 varchar(11))"
        ); // create table
        insert(); //insert records into table
        select(); //select records from table
    
    catch(otl_exception&p)
     // intercept OTL exceptions
        cerr << p.msg << endl; // print out error message
        cerr << p.stm_text << endl; // print out SQL that caused the error
        cerr << p.var_info << endl; // print out the variable that caused the error
    
    db.logoff(); //disconnect from the database
    getchar();
    return 0;

但是当我在我的项目中添加另一个类时,比如类 Test,其中包含 #include "../OTLtest/otlv4.h"。 Visual Studio 2015 不会生成项目。

//TestOTL.h
#pragma once
class TestOTL

public:
    TestOTL();
    ~TestOTL();
;

//TestOTL.cpp
#include "TestOTL.h"
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file

TestOTL::TestOTL()


TestOTL::~TestOTL()

如果我从TestOTL.cpp 文件中删除#include "../OTLtest/otlv4.h",则项目运行良好。

问题

我应该在 main.cpp 之外的文件中包含 OTL 头吗? 如果我应该,那我该怎么做?

【问题讨论】:

【参考方案1】:

看来下面的代码可以工作

#include "TestOTL.h"

#define OTL_ANSI_CPP_11_NULLPTR_SUPPORT
#define OTL_ODBC // CompileOTL 4.0/ODBC
#include "../OTLtest/otlv4.h"// include the OTL 4.0 header file


extern otl_connect db;

TestOTL::TestOTL()

    otl_stream o(1, //buffer size should be == 1 always on INSERT.
        "insert into test_tab values(:f1<int>,:f2<char[5]>)",
        // SQLstatement, char[5] means 5 2-byte
        // Unicodecharatcters including a null
        // terminator
        db // connectobject
        );


TestOTL::~TestOTL()

【讨论】:

以上是关于在工程中包含两个cpp文件(只有一个有main),那这段程序是怎样运行的?的主要内容,如果未能解决你的问题,请参考以下文章

请教 如何运行含多个cpp的一个c++项目里面的一个cpp

51单片机一个工程中包含多个C文件怎么使用

链接器如何知道两个源文件中哪个是主文件,另一个包含函数定义?

C++同一工程main该怎么处理?大家好,同一工程下写不同的CPP文件时好像不能用多个main,那么该怎么办呢?

在cmake的所有cpp文件中包含c ++标头[重复]

编写一个c++工程