重複の可能性:
マクロで引数を単一引用符で囲む方法は?
どうすれば次のことができますか。
#define MACRO(X) ...
MACRO(a) // should give 'a'
もっと簡単な方法を見逃しているかもしれませんが、どうですか#define MACRO(X) ((#X)[0])
。#
文字列化X
してから[0]
、最初の文字を選択します。
Cプリプロセッサでは実行できないようです。少なくともgccdocは、それを率直に述べています。
マクロ引数を文字定数に変換する方法はありません。
このような:
#include <string>
std::string Macro(const std::string& s)
{
std::string ret = "'";
ret += s;
ret += "'";
return ret;
}
これがメタプログラミングに必要であることが明らかになる前に、私はこの回答を投稿しました。メタプログラミングのためにこれを達成する方法はわかりませんが、メタプログラミングは私の得意ではありません。
また、そもそも「プリプロセッサを使わない」と効果的に言っている理由については、以下のコメントを読んでください。しかし、要するに、プリプロセッサを使用して一般的に行われるほとんどすべては、代わりに第1レベルの構造を使用して実行でき、実行する必要があると私は信じています。プリプロセッサを使用すると、C ++型システムが回避され、安全性が低下します。マクロはデバッグが難しく、拡張も困難です。マクロを多用すると、マクロを作成しなかったプログラマーにはなじみのないコードになり、1人しか知らない一種の「秘密の言葉」になり、マクロだけでなく、マクロを使用する機能の保守性が低下します。使用されています。
OK、それはそれほど短くはなかったと思いますが、あります。