2016-09-27 3 views
-3

В C, у меня есть два макросаконкатенация в макро C

Edit: 

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


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

Я должен объединить имя (а char * переменных), число (целое число), дату (другой char* переменное) и отправить его в качестве строка к macro2, которая будет вызываться из macro1.

Я пытаюсь сделать это, объявив переменную char * в макросе 1 и используя snprintf. Это хорошая идея ?

P.S: Я конвертирую строку в строку, а затем объединяю их.

+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; 
} 

Macro для литералов с-строк:

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

Как этот макрос будет работать для строк, не входящих в строку? – Nick

+1

Будет ли это работать для символов * строк? – Novice

+0

@Nick: для нелистных 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; 
} 

в случае С, я также предложить функцию, чтобы определить, как:

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

, но это не всегда будет скомпилирован в C++.

Update:

Как 5gon12eder упоминалось, он делает компилирует на GCC 6.2.1 и 3.8.1 звоном.

Для C++ вместо static вы можете использовать анонимное пространство имен:

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

Наконец, если вы планируете использовать строку просто напечатать его или поместить его в файл, не сцеплять, а просто делать он в этой функции.

+0

Зачем использовать 'static' только в C? Или вы имели в виду, что вместо анонимного «пространства имен» следует использовать в C++? Кроме того, «C++ way» выглядит не очень C++ для меня, по сравнению с, например, решением Jarod42. – 5gon12eder

+0

@ 5gon12eder - оба «статические встроенные» не будут компилироваться на C++. Я решил не упоминать об анонимном пространстве имен. Я считаю, что он использует это для школы и, конечно же, они изучают C, называя его C++. – Nick

+0

Я не знаю, что 'static inline' не разрешено в C++. Однако ваши предположения о C и C++ в школе могут быть правильными. – 5gon12eder

0
#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 ## STR2 

ИЛИ

#define STR1 "wel " 

#define STR2 "come" 

#define STR3 STR1 STR2