简单的c ++函数包含失败

时间:2013-06-26 20:29:38

标签: c++ forward-declaration

我正在尝试在“main”文件中包含另一个文件中的函数。我正在遵循这个范例:

http://www.learncpp.com/cpp-tutorial/18-programs-with-multiple-files/

这是我的主文件digispark.cpp:

#include <iostream>

using namespace std;

int send(int argc, char **argv);

int main()
{
    char* on;
    *on = '1';
    char* off;
    *off = '0';
    send(1,&on);
    return 0;
}

这是我的send.cpp:

#include <stdio.h>
#include <iostream>
#include <string.h>
#if defined WIN
    #include <lusb0_usb.h>    // this is libusb, see http://libusb.sourceforge.net/
#else
    #include <usb.h>        // this is libusb, see http://libusb.sourceforge.net/
#endif

// I've simplified the contents of send for my debugging and your aid, but the
// complicated arguments are a part of the function that will eventually need
// to be here.
int send (int argc, char **argv)
{

    std::cout << "Hello";
    return 0;
}

我正在使用g ++编译器编译Ubuntu 12.10,如下所示:

g++ digispark.cpp send.cpp -o digispark

它成功编译。

然而,当我运行程序时,“Hello”没有出现。因此我根本不相信该函数被调用。我究竟做错了什么?任何帮助都会很棒!谢谢!

编辑:

我是如何处理这个问题的:

int send(int argc, char **argv);

int main()
{
    char* on[4];
    on[0] = (char*)"send";
    on[1] = (char*)"1";
    char* off[4];
    off[0] = (char*)"send";
    off[1] = (char*)"0";  
    send(2,on);
    return 0;
}

对于那些对我坚持这样做的人感到困惑的人,正如我之前所说,send函数已经构建为接受char ** argv(或char * argv [])。我的观点是试图在我的主要功能中模仿它。

重写实际上在send函数中执行的函数来获取不同类型的参数要比发送它想要的内容要困难得多。谢谢大家!

所以,如果这有助于任何尝试类似事情的人随意使用它!

2 个答案:

答案 0 :(得分:1)

你的问题不是你认为的问题。它在这里:

char* on;
*on = '1';

您声明了char指针,但没有初始化它。然后你取消引用它。砰,你死了。这就是所谓的未定义行为。一旦你调用U.B.,任何事情都可能发生。如果你很幸运,那就是崩溃。但是我想这次你不幸运。

看,如果你想开始在内存中存储东西,你必须先分配那个内存。正如hetepeperfan所说,最好的方法是使用std::string并让该类为您处理所有分配/解除分配。但如果由于某种原因你认为你必须使用C风格的字符串和指针,那么试试这个:

char on[128]; //or however much room you think you'll need. Don't know? Maybe you shoulda used std::string ...
*on = '1';
*(on+1) = '\0'; //if you're using C-strings, better null terminate.
char off[128];
*off = '0';
*(off+1) = '\0';
send(1,&on);

答案 1 :(得分:0)

好吧我认为你尝试做类似下面这样的事情,我试图在C ++风格中加入一点,并防止使用指针,因为它们在你展示的代码中不是必需的。

digispark.cpp

#include "send.h"

int main (int argc, char** argv){

    string on  = "1";
    string off = "0";

    send ( on );
    send ( off );

    return 0;
}

send.cpp

#include <iostream>
#include <string>

void send( const std::string& s) {

    std::cout << s << std::endl;

}

send.h

void send(const std::string& s);