C 在另一个宏中使用字符串宏

C 在另一个宏中使用字符串宏,c,string,macros,C,String,Macros,如何在C中的字符串宏中使用另一个宏 我有这个: #define MAX_OPERATION_COUNT 10 #define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first 10 were applied." 但我希望第二个宏使用第一个宏的值。例如,在Java中,我会有如下内容: public static final int MAX_OPERATION_COUNT = 10; public static final S

如何在C中的字符串宏中使用另一个宏

我有这个:

#define MAX_OPERATION_COUNT 10
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first 10 were applied."
但我希望第二个宏使用第一个宏的值。例如,在Java中,我会有如下内容:

public static final int MAX_OPERATION_COUNT = 10;
public static final String MSG_TOO_MANY_OPERATIONS = "Too many operations! Only the first " + MAX_OPERATION_COUNT + " were applied.";
在C中有没有类似的方法

编辑: 这个问题的解决方案与的解决方案非常相似,但我相信问题本身是完全不同的,应该单独处理。

您可以:

#define FOO "1"
#define BAR "How many foos? " FOO " foo.\n"
酒吧现在扩展到

"How many foos? " "1" " foo.\n" 
这是一个有效的字符串文字。

您可以执行以下操作:

#define FOO "1"
#define BAR "How many foos? " FOO " foo.\n"
酒吧现在扩展到

"How many foos? " "1" " foo.\n" 

这是一个有效的字符串文字。

您需要将数字10设置为字符串。 然后,为了连接字符串,您只需关闭双引号,插入表示数字的宏,然后只需再次打开双引号,无需任何加号运算符(如Java/C++中的字符串加号运算符)即可编写消息的其余部分,如下所示:

#define MAX_OPERATION_COUNT "10"
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " MAX_OPERATION_COUNT " were applied."

你需要把数字10变成一个字符串。 然后,为了连接字符串,您只需关闭双引号,插入表示数字的宏,然后只需再次打开双引号,无需任何加号运算符(如Java/C++中的字符串加号运算符)即可编写消息的其余部分,如下所示:

#define MAX_OPERATION_COUNT "10"
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " MAX_OPERATION_COUNT " were applied."

通常,处理printf样式的格式比较容易,操作太多了!仅应用了第一个%u。但是,如果确实要进行字符串替换,则必须执行两次:

#define STR(x) STR2(x)
#define STR2(x) #x
#define MAX_OPERATION_COUNT 10
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " STR(MAX_OPERATION_COUNT) " were applied."

通常,处理printf样式的格式比较容易,操作太多了!仅应用了第一个%u。但是,如果确实要进行字符串替换,则必须执行两次:

#define STR(x) STR2(x)
#define STR2(x) #x
#define MAX_OPERATION_COUNT 10
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " STR(MAX_OPERATION_COUNT) " were applied."

您可以参数化第二个宏:

#define STRINGYFY(x) # x
#define PASTE_AS_STRING(s) STRINGYFY(s)

#define MAX_OPERATION_COUNT 10
#define MANY_OPERATION_COUNT 2

#define MSG_TOO_MANY_OPERATIONS_TEMPLATE(n) \
  "Too many operations! Only the first" PASTE_AS_STRING(n) " were applied."

#define MSG_TOO_MANY_OPERATIONS \
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
#define MSG_MUCH_TOO_MANY_OPERATIONS \
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
刚看到,差不多是一样的,但是年纪大了。尽管如此,我还是把它留在这里,因为我觉得这种方法使用了一种稍微不同的结构

您还可以定义变量并使用宏来初始化它们

要定义数组,请执行以下操作:

const char MSG_TOO_MANY_OPERATIONS[] = 
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
const char MSG_MUCH_TOO_MANY_OPERATIONS[] =
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
还是定义指针呢

const char * MSG_TOO_MANY_OPERATIONS = 
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
const char * MSG_MUCH_TOO_MANY_OPERATIONS =
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)

您可以参数化第二个宏:

#define STRINGYFY(x) # x
#define PASTE_AS_STRING(s) STRINGYFY(s)

#define MAX_OPERATION_COUNT 10
#define MANY_OPERATION_COUNT 2

#define MSG_TOO_MANY_OPERATIONS_TEMPLATE(n) \
  "Too many operations! Only the first" PASTE_AS_STRING(n) " were applied."

#define MSG_TOO_MANY_OPERATIONS \
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
#define MSG_MUCH_TOO_MANY_OPERATIONS \
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
刚看到,差不多是一样的,但是年纪大了。尽管如此,我还是把它留在这里,因为我觉得这种方法使用了一种稍微不同的结构

您还可以定义变量并使用宏来初始化它们

要定义数组,请执行以下操作:

const char MSG_TOO_MANY_OPERATIONS[] = 
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
const char MSG_MUCH_TOO_MANY_OPERATIONS[] =
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
还是定义指针呢

const char * MSG_TOO_MANY_OPERATIONS = 
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
const char * MSG_MUCH_TOO_MANY_OPERATIONS =
  MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)

只是一个旁注:是的,这将扩展。但是有东西告诉我,在代码中可能有这样的情况:如果foo_count