1

Visual Studio 2012 では、math.h で既に宣言されているため、特定の名前をグローバル識別子として宣言できません。レガシーの問題により、ソース コード内の識別子の名前を変更するのは不便です。名前を変更する以外のオプションは何ですか?

#include "stdafx.h"
// iostream includes math.h which declares the following
_CRT_NONSTDC_DEPRECATE(_y1) _CRTIMP double  __cdecl y1(_In_ double _X);

int y1; // error - y1 is already declared

void Main()
{
    return;
}

おまけの質問: Visual Studio 2012 はこれを準拠した方法で処理していますか?

4

3 に答える 3

2

これは C++ であるため、特にグローバル変数がある場合は、独自のものに名前空間を使用する必要があります。

#include "stdafx.h"

namespace MyApp
{
    int y1; // MyApp::y1
}

このように、名前空間名なしで変数を使用する必要がある場合は、 usingキーワードに依存できます。y1

using MyApp::y1; // Now also y1
于 2012-09-16T00:47:09.423 に答える
0

識別子y1は の一部のバージョンに表示される場合がありますが<math.h>、C または C++ 標準では定義されていません。y1おそらく言語拡張機能を無効にすることで、宣言を回避する方法でコンパイラを呼び出すことができるはずです。コンパイラがこれを許可しない場合、それは実装のバグです。

y1()は「第 2 種ベッセル関数」の 1 つです (意味がよくわかりません)。POSIXで指定されています。

于 2012-09-16T01:17:43.917 に答える
0

コメントで述べたように、ではなくiostreamを含めます。微妙な違いは、すべてを名前空間に配置することです。問題は、次のようなことをしていることです...math.hcmathcmathstd

using namespace std;

...しないでください。ご覧のとおり、グローバル名前空間にあいまいさを導入しているのはあなた自身です。代わりに、含まれているヘッダーで宣言されているメンバーstdでグローバル名前空間を汚染するのではなく、から必要なものを明示的に指定するようにしてください。stdまた、グローバル変数とグローバル名前空間自体を使用しないようにする必要があります。

_tmain補足として、ここでが呼び出されたことが不明確だったので、コード全体を表示してみてMainください。

于 2012-09-16T02:20:40.133 に答える