头文件编码与cpp编码:不同的行为

时间:2012-03-15 23:44:53

标签: c++ arduino

我发现除非在头文件本身上声明,否则某些代码将无效。例如,使用以下代码,调用test()时将打印“Hello World”:

//Myclass.h
class Myclass {
private:
    SoftwareSerial *ss;
public:
    void test() {
        ss = & SoftwareSerial(0,1);
        ss->begin(9600);
        ss->print("Hello World");;
    };
};

但是如果我只是在标题上声明方法test()并像往常一样在单独的cpp上编码,使用完全相同的代码,它会编译但不会输出任何内容:

//Myclass.cpp
void Myclass::test(){
    ss = & SoftwareSerial(0,1);
    ss->begin(9600);
    ss->print("Hello World");
 };
 //this won't output anything

为什么?

1 个答案:

答案 0 :(得分:7)

SoftwareSerial是一种类型。你正在指向一个临时指针,然后在暂时死亡后取消引用它。这是非法;我不知道为什么你的编译器会接受它,但我会想出一个问题并建议这并不意味着它正在做你认为的那样。它可能会破坏某些东西并导致奇怪的行为,试图合理化是愚蠢的。

相反:

//Myclass.h
class Myclass {
private:
    SoftwareSerial ss;
public:
    Myclass();
    void test();
};


//Myclass.cpp

Myclass::Myclass() : ss(0,1) {};

void Myclass::test() {
    ss.begin(9600);
    ss.print("Hello World");
};