C++ 宏C中的字符串连接

C++ 宏C中的字符串连接,c++,c,macros,c-strings,C++,C,Macros,C Strings,在C语言中,我有两个宏 Edit: #define macro1(name , number , date ){\ <---------body------> } #define macro2(key){\ <------body-----> } 编辑: #定义宏1(名称、编号、日期){\ } #定义宏2(键){\ } 我必须组合名称(一个char*变量)、数字(一个整数)、日期(另一个char*变量),并将其作为字符串发送到macro2,该变量将从ma

在C语言中,我有两个宏

Edit:

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


#define macro2(key){\
 <------body----->
 }
编辑:
#定义宏1(名称、编号、日期){\
}
#定义宏2(键){\
}
我必须组合名称(一个
char*
变量)、数字(一个整数)、日期(另一个
char*
变量),并将其作为字符串发送到
macro2
,该变量将从
macro1
调用

我试图通过在宏1中声明一个char*变量并使用snprintf来实现这一点。这是个好主意吗

附言:我将转换为字符串,然后将它们组合起来。

c++中的函数:

std::string concat(const std::string& name, int number, const std::string& date)
{
    return name + std::to_string(number) + date;
}
用于文本c字符串的宏:

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

如果使用宏执行此操作,它将变得太大和混乱

您可以使用内联函数来代替宏。这是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和clang 3.8.1上编译

< C++ >代替<代码>静态< /代码>,可以使用匿名命名空间:

namespace{
    inline const char *macro1(const char *name, int const number, const char *date, char *buffer, size_t buffer_size);
}
最后,如果您计划只使用字符串来打印它,或将其放入文件中,请不要连接,而只在该函数中执行

#define STR1  "wel "

#define STR2  "come"

#define STR3  STR1 ## STR2


什么是“DEF”?这不是C或C++。请使用真正的代码和适当的标记,因为标记是帮助找到您的问题的人的方式。“编辑:”是什么?
name
/
date
文字字符串还是常规变量?为什么不使用函数而不使用宏?这个宏如何处理非“内联”字符串?@Nick:对于非文字c字符串,使用函数更好,因为宏确实比常规函数有任何改进。(甚至对于文字,我也会使用函数),但函数使用的是
std::string
,而不是
char*
。只有在执行宏(“字符串”,5,“日期”)时,宏才会工作。如果你传递变量,即使是常量变量,它也不起作用。@Nick:如果你传递变量,你更喜欢函数而不是宏。(我不是故意在宏中显示处理变量的方法)。当然。但是它是std::string,他可能正在做他的家庭作业。为什么只在C中使用
static
?或者,你是说在C++中应该使用匿名<代码>命名空间< /代码>来代替?此外,“C++方式”对我来说并不像C++,看起来像是JAROD42的解决方案。@“5GNO12EDER”——“静态内联”都不能在C++上编译。我决定不提匿名名称空间。我相信他是用这个来学的,当然他们通过调用C++来学习C。我不知道C++中的代码< >静态内联< /代码>是不允许的。你在学校里关于C和C++的猜想可能是对的,你是对的。我发誓一年前为了编译,我不得不在20多行上删除它。不记得它是什么版本的gcc。
##
运算符用于连接标记,例如变量名,并生成新标记,而不是字符串<代码>#定义STR3 STR1##STR2将生成令牌STR1STR2,因为没有这样的宏名、变量名、函数名等。编译将失败。第二个示例连接两个字符串文本,而OP要求连接
char*
变量和一个整数文本。
#define STR1  "wel "

#define STR2  "come"

#define STR3 STR1 STR2