首先,我不是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 ++编译器而发生?它不支持“阶级”声明吗?我应该更改什么才能运行该代码?
谢谢!
答案 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
。