2

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

所以我有

主文件

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

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

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

数学.h

#ifndef math
#define math

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

#endif

数学.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:错误:声明没有声明任何东西

怎么了?据我了解,它不喜欢我的“数学数学”行,但尝试在我的 VS2010 中没有这样的错误。它是由于g ++编译器而发生的吗?它不支持“类”声明吗?我应该改变什么来运行该代码?

谢谢!

4

3 回答 3

3

#define math在你的标题。所以预处理器看到Math math并说“哦,等等,正确的替换也是如此” #define mathMath因此,当编译器给出声明时,它会看到Math ;. 这显然是不洁的。宏应该总是全部大写,特别是头部保护通常采用非常具体的形式,比如,HEADER_GUARD_MATH_H或者类似的东西。

于 2012-07-10T13:01:38.417 回答
1

在编译 math.cpp 时,您也可能会遇到问题。您的编译器可能会混淆

#include "math.h"

这可能指向math.hC 标头。

还有,真的很不好#define math。您永远不应该#define使用具有如此简单名称的宏。最好的例子就是你的代码:

Math math;

但是每次出现的math标记都会被预处理/替换为该宏的内容:

Math ;

对于 header gurads,我通常推荐 pattern FILENAME_EXT_INCLUDED_YYYYMMDD,在你的情况下

#ifndef MATH_H_INCLUDED_20120710
#define MATH_H_INCLUDED_20120710
...
#endif

像这样的简单模式MATH_H可能已经太简单了,因为您math.h将来可能会引入其他模式(这在过去不止一次发生在我身上,自从我使用带有日期的模式以来)。

于 2012-07-10T13:00:47.653 回答
0

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

于 2012-07-10T12:58:18.497 回答