0

別のメソッドの関数を使用して定数を定義する方法はあり#defineますか?

たとえば、ファイル foo.cpp に int を返すメソッドがあります。

int foo() { return 2; }

私のbar.cppには、次のようなものが必要です

#define aConstant foo()

出来ますか?それを行う方法はありますか?

(私は Visual Studio 2010 を使用しています)

編集:constexpr私はVS 2010を使用しているので機能しません。他のアイデアはありますか?

4

3 に答える 3

2

成功する

constexpr int foo() { return 2; }

その後、別のユニットで

static constexpr int aConstant = foo();
于 2012-11-17T23:07:37.987 に答える
1

static int const a = bar();名前空間スコープのコードのどこかで言うことについて、本質的に悪いことは何もありません。である場合を除いbarて、初期化は動的初期化フェーズconstexpr中に発生します。これは特定の順序の問題につながる可能性がありますが、それ自体が壊れているわけではなく、その後の使用は想像できる限り効率的です。a

または、関数をマクロにすることもできます。

#define TIMESTWO(n) (n * 2)
于 2012-11-17T23:19:15.453 に答える
1

残念ながら、Visual C ++ 2010は、この表constexpr(Apache Stdcxxプロジェクトから)に示されているように、C ++ 11によってもたらされる機能をサポートしていません。MSVC(MicroSoft Visual Studio C / C ++コンパイラ)はまだサポートしていません(7行目を確認してください)。 )。

ただし、foo()本体をfoo.cppファイルに保持して、中間グローバル変数を使用することはできます。

inline int foo() { return 2; }
const int aConstant = foo();

次にbar.cppファイルで:

extern const int aConstant;

void bar()
{
   int a = 5 * aConstant;
}

インライン化を許可するようにVisualC++を構成した場合(これがデフォルトです)、aConstantコンパイル時に初期化されます。それ以外の場合は、実行時foo()に初期化するために呼び出されますaConstantが、起動時(main()関数が呼び出される前)に呼び出されます。したがって、これは、戻り値が使用されるfoo()たびに呼び出すよりもはるかに優れています。const

于 2012-11-17T23:20:29.703 に答える