Cygwin g ++和声明没有声明任何内容

时间:2012-07-10 12:56:26

标签: c++ cygwin

首先,我不是C / C ++的热心用户,但我有一个用两种语言编写的项目。此外,它基于一些Unix类型(所以VS不是一个选项,是吗?)我目前正在使用Windows 7 x32,我决定看一下Cygwin(g ++编译器)。但在移动整个项目之前,我想在不太困难的情况下尝试它。

所以我有

的main.cpp

#include <iostream>
#include "h/math.h"

int main()
{
    Math math; // just declare the Math variable, nothing else

    std::cin.get();
    return 0;
}

math.h中

#ifndef math
#define math

class Math
{
public:
    int Addition(int, int);
    int Multiplication(int, int);
};

#endif

math.cpp

#include "math.h"

int Math::Addition(int x, int y)
{
    return x + y;
}

int Math::Multiplication(int x, int y)
{
    return x * y;
}

然后我打开“... \ Cygwin \ Cygwin.bat”,设置我的文件的路径(cd C:\ Proj)并尝试使用以下命令进行编译:

$ g ++ main.cpp

我得到的是一个错误:      main.cpp:error:声明未声明任何内容

怎么了?据我所知,它不喜欢我的“数学数学”系列,但在我的VS2010中尝试这一点没有这样的错误。它是否由于g ++编译器而发生?它不支持“阶级”声明吗?我应该更改什么才能运行该代码?

谢谢!

3 个答案:

答案 0 :(得分:3)

您标题中的#define math。因此,预处理器看到Math math并且“噢,等等,#define math,所以Math是正确的替代”。因此,当给出编译器声明时,它会看到Math ;。这显然不是犹太人。宏应该总是全部大写,特别是标题保护通常采用非常具体的形式,如HEADER_GUARD_MATH_H或类似的形式。

答案 1 :(得分:1)

编译math.cpp时可能会遇到问题。您的编译器可能会与

混淆
#include "math.h"

可能指向math.h C标题。

此外,#define math真的很糟糕。永远不应该#define一个具有如此简单名称的宏。最好的例子就是为什么不是你的代码:

Math math;

math令牌的每次出现都会被该宏的内容预处理/替换:

Math ;

对于标题gurads,我通常建议使用模式FILENAME_EXT_INCLUDED_YYYYMMDD,在你的情况下

#ifndef MATH_H_INCLUDED_20120710
#define MATH_H_INCLUDED_20120710
...
#endif
MATH_H这样的简单模式可能已经过于简单了,因为您将来可能会引入其他math.h(这在我过去发生过不止一次,因为我使用了模式日期)。

答案 2 :(得分:0)

您必须在命令行中包含所有源文件,例如g++ main.cpp math.cpp