2012-02-25 18 views
2

gccを使用して、コンパイラが定数であることをコンパイラが認識している場合は、関数の入力に対してコンパイル時のチェックを行います。GCC定数関数の入力のコンパイル時のチェック

私は、非常にほぼの作品があります。私が見る限り、それはうまくいくはずです。

注:__builtin_constant_p(expression)は、式がコンパイル時に定数であることがわかっているかどうかを返します。我々は、UART(ポート)を呼び出すときに、次のコードは動作するはずポート< 2かどうかを確認したいと仮定すると、

#include <stdio.h> 

void _uart(int port) { 
printf("port is %d", port); 
} 

#define uart(port) \ 
static_assert(__builtin_constant_p(port)? port<2: 1, "parameter port must be < 2"); \ 
_uart(port) 

int main(void) { 
int x=1; 
uart(x); 
} 

UARTを呼び出すときに、この作品()。残念ながら、非定数xに対してはうまくいきません。何らかの理由で、static_assertは、理論上__builtin_constant_p()が定数を渡していなくても、xが定数ではないケースを処理できません。エラーメッセージは次のとおりです。

c:\>gcc a.cpp -std=c++0x -Os 
a.cpp: In function 'int main()': 
a.cpp:13: error: 'x' cannot appear in a constant-expression 

アイデアはありますか?

+0

"何らかの理由で" "定数式"の正式な文法では、 "コンパイル時に左辺が確かに' false'ならば、 '? '演算子のルールは存在しません。 2番目のパラメータは定数式である必要はありません。 "定数式"の文法では、 "すべてのコンポーネント(評価されると使用されなくなったものも)は定数式でなければなりません。"そのため、「定数式の評価された部分には表示できません」というエラーメッセージには、「定数式では表示できません」というメッセージが表示されます。 –

答えて

1

あなたはLinuxカーネルで使用されるトリックを試すことができます。

What is ":-!!" in C code?

(やや恐ろしい)Linuxカーネルのマクロがパラメータで許可されている式の種類についてはあまり厳密です。

+0

これはCでは動作しますが、C++では動作しません。 – Berwyn

2

あなたのコードはg ++(GCC)4.8.2で動作します。

- ただし、正しく記載されているとおり、最適化は行われていません。

我々は

static_assert(__builtin_choose_expr(__builtin_constant_p(port), \ 
          port<2, 1), "parameter port must be < 2") 

を使用することができる唯一の場合は - 残念ながら__builtin_choose_exprコンストラクトは、現在C.

でのみ利用可能しかし、悲しいことにまだリリースにそれをしなかったC++ patchがありますされます。

+1

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと、 – Berwyn

関連する問題