2

次の例はコンパイルされ(VS2010 C ++コンパイラは警告C4353を発行します)、式(*)は次のように評価され0ます。

#include <iostream>
#include <string>

int main()
{
   0(1, "test"); // (*) - any number and type of arguments allowed       
   int n = 0(1, "test"); // 0
   std::string str(0(1, "test")); // Debug assertion fails - 0 pointer passed
}

0C ++標準で許可/規制されている関数名として使用していますか、それともその解像度はコンパイラ固有ですか?N3242ドラフトを調べていましたが、これに関連するものは見つかりませんでした。Microsoftコンパイラは、明らかにそのような構成(または__noop)を値を持つ整数として解決します0

警告C4353:

警告C4353:非標準の拡張が使用されました:関数式として定数0。代わりに__noop関数組み込みを使用してください

4

2 に答える 2

3

答えはわかりませんが、少しグーグルで見つけることができると思います...

MSDNを見ると、次の2つのリンクが見つかりました。

2番目のリンクは__noop

__noop組み込み関数は、関数を無視し、引数リストを解析する必要があるが、引数のコードは生成されないことを指定します。これは、可変数の引数を取るグローバルデバッグ関数での使用を目的としています。

この例は、__noopデバッグコードにとって非常に興味深いものになる可能性があることを示しています。

#if DEBUG
    #define PRINT printf_s
#else
    #define PRINT __noop
#endif

int main() { PRINT("\nhello\n"); }

0同じページの別のコメントは、関数の歴史的なヒントを示しています。

コンパイラは、コンパイル時に__noop組み込み関数を0に変換します。

かつて、この拡張機能は0ではなくと呼ばれてい__noopましたが、後でMicrosoftが__noopキーワードを作成したのは、検索が簡単で、読みやすく、「奇妙」でなく0、拡張機能として明確にマークされていたためです( MSVC__declspecやgccのような2つの主要なアンダースコアのため__attribute__)。

結論:どう0ですか?

  • これは拡張機能です(警告メッセージによる)
  • これは歴史的な非推奨の拡張機能です
  • その使用は廃止され、__noop
  • 少なくともVC++2003の時点で非推奨になりました(以前ではない場合)
于 2012-04-19T13:01:42.840 に答える
3

関数名は識別子であり、識別子は数字以外で始める必要があります(§2.11):

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
于 2012-04-19T12:37:40.487 に答える