2016-09-27 26 views
-3

、私は、名前(char *変数)、数(整数)、日付(別のchar*変数)を組み合わせてとして送信しなければならない二つのマクロ文字列連結Cで

Edit: 

#define macro1(name , number , date){\ 
<---------body------> 
} 


#define macro2(key){\ 
<------body-----> 
} 

を有しますmacro1から呼び出されるmacro2の文字列です。

私はマクロ1でchar *変数を宣言し、snprintfを使用してそれを実行しようとしています。これは良いアイデアですか?

P.S:私は文字列に変換して、それらを組み合わせています。 Cの++で

+4

"DEF" とは何ですか? – Nick

+1

これはCやC++ではありません。タグはあなたの質問を見つける手助けとなるので、実際のコードと適切なタグ付けを使用してください。 – unwind

+0

「編集:」とは何ですか? –

答えて

1

機能:リテラルのC-文字列のマクロ

std::string concat(const std::string& name, int number, const std::string& date) 
{ 
    return name + std::to_string(number) + date; 
} 

#define MACRO(name, number, date) name #number date 
+1

"インライン"以外の文字列でこのマクロがどのように動作するのでしょうか? – Nick

+1

これはchar *文字列のために動作しますか? – Novice

+0

@ニック:リテラルでないC-ストリングの場合、MACROは通常の機能よりも改善を提供するので、機能を使用する方が優れています。(そして、文字通り私は関数を使うだろう)。 – Jarod42

0

あなたはマクロでこれを行う場合は、それが大きすぎると厄介になります。

マクロの代わりに、インライン関数でこれを行うことができます。これは、より多くのC++の方法ですが、それはあまりにもCに大きな動作します:

inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t const buffer_size){ 
    // copy everything into the buffer, probably with sprintf() 
    return buffer; 
} 

をCの場合には、私はまた、機能を提案するように定義される:

static inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t buffer_size); 

が、これは常にではコンパイルされません。 C++。

更新:5gon12ederが述べたように

、それはGCC 6.2.1と打ち鳴らす3.8.1でコンパイルを行います。あなたはそれを印刷したり、ファイルに入れて、連結していないために、文字列を使用する予定が、ちょうど行った場合、最後に

namespace{ 
    inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t buffer_size); 
} 

:匿名名前空間を使用することができますC++のために代わりのstatic

それはこの関数内にあります。

+0

Cで 'static'を使うのはなぜですか?それとも、C++では無名の 'namespace'を代わりに使うべきですか?また、「C++のやり方」は、Jarod42のソリューションに比べて、C++のほうが私にはあまり見えません。 – 5gon12eder

+0

@ 5gon12eder - "静的インライン"はC++でコンパイルされません。私は匿名の名前空間について言及しないことにしました。私は彼が学校でこれを使っていると信じています。もちろん、C++と呼んでCを学んでいます。 – Nick

+0

C++では 'static inline'が許可されていないことに気づいていません。しかし、学校でCとC++についてのあなたの推測は正しいかもしれません。 – 5gon12eder

0
#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 ## STR2 

OR

#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 STR2