Cygwin g++和声明不声明任何内容

Cygwin g++ and declaration does not declare anything

本文关键字:声明 任何内 Cygwin g++      更新时间:2023-10-16

首先,我不是一个热衷于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:错误:声明没有声明任何东西

怎么了?据我所知,它不喜欢我的"数学数学"行,但在我的VS2010中尝试过,并没有出现这样的错误。这是由于g++编译器造成的吗?它不支持"类"声明吗?我应该更改什么来运行该代码?

谢谢!

您在标头中#define math。因此,预处理器看到Math math,然后说"哦,等等,#define math,所以Math是正确的替换"。因此,当编译器给出声明时,它会看到Math ;。这显然不是犹太洁食。宏应该总是全大写,尤其是头保护通常采用非常特殊的形式,比如HEADER_GUARD_MATH_H或类似的形式。

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

#include "math.h"

其可以指向CCD_ 7C报头。

此外,这对#define math来说真的很糟糕。您永远不应该#define一个名称如此简单的宏。为什么不这样做的最好例子是你的代码:

Math math;

但是CCD_ 10令牌的每次出现都被预处理为该宏的内容:

Math ;

对于标头gurad,我通常推荐模式FILENAME_EXT_INCLUDED_YYYYMMDD,在您的情况下是

#ifndef MATH_H_INCLUDED_20120710
#define MATH_H_INCLUDED_20120710
...
#endif

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

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