2

まず第一に、私は C/C++ の熱心なユーザーではありませんが、両方の言語で書かれた 1 つのプロジェクトがあります。さらに、いくつかの 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

数学.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:エラー:宣言は何も宣言しません

どうしたの?私が理解しているように、「Math math」行は好きではありませんが、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.hこれはC ヘッダーを指している可能性があります。

また、本当に悪い#define mathです。#defineこのような単純な名前のマ​​クロは絶対に使用しないでください。そして、そうでない理由の最良の例はあなたのコードです:

Math math;

ただし、トークンが出現するたびmathに、そのマクロのコンテンツに前処理/置換されます。

Math ;

ヘッダーガードの場合、私は通常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 に答える