2

コンパイル時に C++ コンパイラが定数文字列のハッシュ値を合成する派手なゲームをプレイしようとしています。これにより、文字列を単一の識別子に置き換えることができ、コードのサイズと複雑さを大幅に節約できます。

プログラミングをわかりやすく簡単にするために、コンパイル時定数文字へのコンパイル時定数ポインターである "Hello" のような単純なインライン文字列を使用して、コンパイル時に調べて計算できれば最高です。

コンパイル時にこれらにインデックスを付けることができれば、テンプレート メタプログラムを作成して、自分のやりたいことを実行できます。しかし、C++ 標準が ct-constant 配列の ct-constant インデックスをそれ自体で ct-constant として扱うかどうかは不明です。

別の言い方をすると、

 const char v="Hello"[0];

非常に有効な C++ (および C) です。しかし、値 va はコンパイル時定数ですか?

私はすでに答えはノーだと信じていますが、実際には一部のコンパイラは警告さえもせずにそれを受け入れ、エラーははるかに少なくなります。たとえば、次のコードは、Intel の C++ コンパイラからの警告が 1 つも表示されずにコンパイルおよび実行されます。

#include <iostream>
const char value="Hello"[0];
template<char c>  void printMe()
{
  std::cout << "Template Val=" << c << std::endl;
}

int main()
{
  const char v='H';
  printMe<'H'>();
  printMe<v>();
  printMe<value>(); // The tricky and interesting case!
}

ただし、Microsoft のコンパイラはまったくコンパイルせず、内部リンケージを持つオブジェクトでテンプレートを使用することについて、合理的に一貫したエラー メッセージを表示します。

私の質問に対する答えは、「いいえ、定数インデックスを持つ定数配列への配列参照であっても、コンパイル時に定数であると想定することはできません」だと思います。これは、インテル コンパイラーの正常な実行がインテル コンパイラーのバグであることを意味しますか?

4

3 に答える 3

2

GCCでも動作しません。

ただし、言語コンプライアンスの観点以外では、コンパイラオプティマイザがそれを文字定数として扱うのは素晴らしいことです。私はその事実を利用して、プリプロセッサで生成された文字定数を許可しました(を使用して*#foo)。ファイル内のhttp://cvs.openbsd.org/cgi-bin/query-pr-wrapper?full=yes&numbers=1652を参照してくださいhdr.h。そのマクロで、あなたは書くことができます

DECR(h, e, l, l, o)

それよりも

DECR('h', 'e', 'l', 'l', 'o')

私の見解では、はるかに読みやすいです。:-)

于 2009-04-20T05:32:52.787 に答える
1

良い質問です。はい、これは実行できます。標準では問題ありません。Microsoft、GCC、および Intel でも動作します。問題は、構文が間違っていることです:)

ちょっと待って、サンプルを調理します... わかりました。このサンプルは有効な C++ であり、私はかなり頻繁に使用してきましたが、実際、ほとんどのプログラマーは正しい方法を知りません。

template<char* MSG>
class PrintMe
{
public:
    void operator()()
    {
        printf(MSG);
    }
};

char    MyMessage[6] = "Hello"; //you can't use a char*, but a char array is statically safe and determined at compiletime

int main(int argc, char* argv[])
{
    PrintMe<MyMessage> printer;
    printer();
    return 0;
}
于 2009-04-20T07:03:27.860 に答える
0

ここでの関連する違いは、「整数定数式」と単なるコンパイル時定数の違いです。「3.0」はコンパイル時の定数です。「int(3.0)」もコンパイル時の定数です。ただし、「3」だけが ICE です。[5.19 を参照]

詳細については、boost.org をご覧ください

于 2009-04-20T09:01:13.957 に答える