web-dev-qa-db-ja.com

cppマクロで改行を生成する方法は?

改行を含むように拡張するcppマクロを作成するにはどうすればよいですか?

39
user18458

テンプレートで置き換えることができないコードを合成するために、多くのプリプロセッサマクロ関数を含む大規模なプロジェクトに取り組んでいます。私を信じて、私はあらゆる種類のテンプレートトリックに精通していますが、コードを直接作成できる標準化されたタイプセーフなメタプログラミング言語がない限り、古き良きプリプロセッサとその厄介なマクロを使用して、いくつかの問題を解決する必要がありますせずに10倍以上のコードを書く必要があります。一部のマクロは多くの行にまたがっており、前処理されたコードで読み取るのは非常に困難です。したがって、私はその問題の解決策を考え、私が思いついたのは次のとおりです。

たとえば、複数行にまたがるC/C++マクロがあるとします。 MyMacro.hppという名前のファイル

// Content of MyMacro.hpp

#include "MultilineMacroDebugging.hpp"

#define PRINT_VARIABLE(S) \
__NL__  std::cout << #S << ": " << S << std::endl; \
__NL__  /* more lines if necessary */ \
__NL__  /* even more lines */

このようなマクロを定義したすべてのファイルに、以下を含む別のファイルMultilineMacroDebugging.hppを含めます。

// Content of MultilineMacroDebugging.hpp

#ifndef HAVE_MULTILINE_DEBUGGING
#define __NL__
#endif

これは空のマクロ__NL__を定義します。これにより、前処理中に__NL__定義が消えます。マクロはどこかで使用できます。 MyImplementation.cppという名前のファイル内。

// Content of MyImplementation.cpp

// Uncomment the following line to enable macro debugging
//#define HAVE_MULTILINE_DEBUGGING

#include "MyMacro.hpp"

int a = 10;
PRINT_VARIABLE(a)

PRINT_VARIABLEマクロをデバッグする必要がある場合は、マクロHAVE_MULTILINE_DEBUGGINGを定義する行のコメントを外しますMyImplementation.cpp__NL__マクロは未定義の結果となるため、結果のコードはもちろんコンパイルされません。これにより、コードはコンパイルされたコードに残りますが、前処理は可能です。

重要なステップは、お気に入りのテキストエディターを使用して、プリプロセッサー出力の__NL__文字列を改行で置き換えることです。これにより、前処理後、置き換えられたマクロの結果が読み取り可能な表現になり、コンパイラは、人為的に導入された改行を除いて、見ます。

17

それは不可能。リストファイルまたはプリプロセッサの出力を表示している場合にのみ関係があります。

マクロを読みやすくするための一般的な手法は、\文字を使用してマクロを次の行に続けることです。

私は(信じている)、出力を一覧表示する際に、展開されたマクロに改行を含めるコンパイラを見てきました。これは、拡張マクロを読んで貧弱な人間がコンパイラに実際に要求したことを理解しようとする私たちにのみ役立ちます。コンパイラーに違いはありません。

CおよびC++言語は、文字列の外側のすべての空白を同じ方法で扱います。ちょうどセパレータとして。

8
itj

CおよびC++コンパイラは、引用符で囲まれていない空白を無視します(>>テンプレートの問題を除く)。そのため、マクロに改行を出力させることは、実際には意味がありません。マクロの各行をバックスラッシュで終了することにより、マクロを複数行に広げることができますが、これは改行を出力しません。

7
Mike Thompson

Cコンパイラは空白を認識しますが、スペース、タブ、または改行を区別しません。

マクロの文字列内に新しい行を追加するにはどうすればよいですか?

#define SOME_STRING "Some string\n with a new line."

動作します。

5
David L Morris