2012-01-22 13 views
3

プリプロセッサを使用して、#defineを使用して特定のキーワードを他の単語に置き換えることができます。例えば、私は#define name "George"を実行することができ、プリプロセッサがプログラム内で 'name'を見つけるたびに、それを "George"に置き換えます。C++プリプロセッサは文字列でどのように使用できますか?

ただし、これはコードでのみ動作するようです。どのように私は文字列やテキストでこれを行うことができますか?たとえば、画面に「こんにちは私は名前です」と表示した場合、文字列でありコードではなくても、「名前」を「George」に置き換えます。

手動でキーワードの文字列を検索して置き換えるのではなく、代わりにプリプロセッサを使用して単語を切り替える必要があります。

これは可能ですか?もしそうなら、どのように?

私はC++を使用していますが、Cのソリューションも使用できます。

答えて

15
#define name "George" 

printf("Hello I am " name "\n"); 

隣接する文字列リテラルは、CおよびC++で連結されています。 CおよびC++標準から

引用:Cについては

(C99を引用したが、C11は6.4.5p5に似た何かを持っている):

(C99、6.4.5p5)「訳ありフェーズ6では、隣接する文字列と同じ接頭辞の文字列リテラルトークンのいずれかのシーケンスで指定されたマルチバイト文字列が、単一のマルチバイト文字列に連結されます。

C++について

(C++ 11、2.14.5p13) "は、翻訳フェーズ6(2.2)では、隣接する文字列リテラルは連結されます。"

EDIT:CおよびC++標準から引用符を追加します。 C++ 11の引用のための@MatteoItaliaに感謝します。

+0

これはコンパイルされません。 –

+0

これは 'printf(" Hello "私は" George "" \ n ");になります。これは無効です。 –

+13

これはCで完全に有効であり、実装はコンパイルする必要があります。 – ouah

3

問題はプリプロセッサが文字列リテラルの中にのトークンを置き換えないことです。

は、だから、プリプロセッサではなくprintfような関数や変数を使用し、またはそうのような文字列からトークンを引く必要があり、次のいずれか

#include <iostream> 

#define name "George" 

int main(int argc, char** argv) { 
    std::cout << "Hello I am " << name << std::endl; 
} 
ここ
7
#define name "George" 

printf("Hello I am %s\n", name); 

はジョージ」に置き換えられます名前"

関連する問題