2

GCC と Clang の場合、これは簡単に実行できます。

    // absolute value
    inline constexpr int abs(const int number)
    { return __builtin_abs(number); }
    inline constexpr long abs(const long number)
    { return __builtin_labs(number); }
    inline constexpr long long abs(const long long number)
    { return __builtin_llabs(number); }
    inline constexpr double abs(const double& number)
    { return __builtin_fabs(number); }
    inline constexpr float abs(const float& number)
    { return __builtin_fabsf(number); }
    inline constexpr long double abs(const long double& number)
    { return __builtin_fabsl(number); }

これは魅力のように機能します。ほとんどすべての数学関数に対して同様のことを行い、コードを MSVC でも動作させたいと考えています。MSVCで上記と同等のことを行うにはどうすればよいですか?

編集:明確にするために:質問は__builtin_*関数に関するものであり、他には何もありません。私は試した

#pragma intrinsic(abs)

しかし、これには abs 関数の宣言が必要です。これは、グローバル名前空間には入れたくないものです。

4

1 に答える 1

1

組み込み関数は移植性がないため、対応する組み込み関数を手動で検索してリストに追加し、#ifdefモードを切り替えるために使用する必要があります。

absちなみに、グローバル名前空間にある必要はありません。<cstdlib>代わりに含めると、代わりに取得されます。<stdlib.h>std::abs

コンパイラは独自の組み込み関数を認識しており、MSVC は/Oi スイッチを使用してそれらを有効にします。

于 2012-01-18T10:26:14.387 に答える