2016-05-13 4 views
0

intからint64_tへのキャスト時にg ++またはclangで警告を有効にすることはできますか? 例:gccまたはclangのintからint64_tへの変換時の警告を有効にする方法

int n; 
cin >> n; 
int64_t power = (1 << n); 

私は、コンパイラは三行目では、この変換について私に告げることをしたいです。

+0

アップキャストで警告が表示されないのはなぜですか? – NathanOliver

+0

3番目の文は構文的には有効ではありません。修正できますか? – Bathsheba

+1

'(1LL << n)'があなたが実際に望むものなので、警告が必要だと思います。 –

答えて

2

あなたはこれらのラインに何かを構築することができます:

struct my_int64 
{ 
    template<class Y> my_int64(const Y&) 
    { 
     static_assert(false, "can't do this"); 
    } 
    template<> my_int64(const long long&) = default; 
    /*ToDo - you need to hold the data member here, and 
     supply necessary conversion operators*/ 
}; 

その後

int n = 3; 
my_int64 power = (1LL << n); 

コンパイルが、

my_int64 power = (1 << n); 

はしません。その意味では、これは良い出発点です。プリプロセッサーをハックしてint64_tの代わりに使用することができます。

あなたはエラーではなく警告を望んでいた場合、あなたはstatic_assert

my_int64 x{}; Y y = x;希望コンパイラを置き換えることができますが変換を狭くに対して警告を発し、二つの文を最適化するために、それを信頼します彼らは集合的にノーオペレーションであるからです。

+0

はい、私はそのアイデアが気に入っています。しかし、おそらくstatic_assertは私が探しているものではないでしょう。 –

+0

@SukhanovNiсkolay_ "私はちょうど警告したいので、"あなたは厄介です。 'static_assert()'を 'static_assertion_warn()'のようなものに書き直す必要があるのではないかと思います。それを楽しんでください。 –

+2

OK。それは金曜日です。それのためのアイデアを貼り付けた。 – Bathsheba

関連する問題