在没有strcat的情况下连接字符串#define

时间:2018-06-19 17:33:15

标签: c concatenation c-preprocessor preprocessor-directive

在我正在处理的项目中,我有一个与此类似的代码:

#include<stdio.h>

struct parameter_struct{
    char *parameter_name;
    int parameter_value;
};

int main(){
  struct parameter_struct param1= {"x_custom_param1", 6};
  printf("parameter name: %s\n", param1.parameter_name);
  return 0;
}

我现在需要实现的是使用预定义的宏使参数名称动态化:

#define macro_custom "x_custom1_"  

因此,参数名称应为与“ param1”子字符串连接的宏值。我的意思是它将是“ x_custom1_param1”,而不是实际的静态值“ x_custom_param1”。

在我的项目中,所有参数都是这样静态声明的:

{"x_custom_param1", 6};

并且我不能碰到这种代码结构。因此,例如,我无法在c函数中动态初始化这些参数,而无法在该函数中使用strcat。

所以我想到的是使用另一个#define和##语句。所以我的代码将是这样:

#include<stdio.h>

#define macro_custom "x_custom1_"
#define f(g,h) g##h


struct parameter_struct{
    char *parameter_name;
    int parameter_value;
};

int main(){
  struct parameter_struct param1= {f(macro_custom, "param1"), 6};
  printf("parameter name : %s\n", param1.parameter_name);
  return 0;
}

但出现编译错误:

error: pasting "macro_custom" and ""param1"" does not give a valid preprocessing token
   struct parameter_struct param1= {f(macro_custom, "param1"), 6};

这似乎合乎逻辑,因为我定义的宏未使用##

返回字符串

有人知道我该如何纠正我的想法?还是有更好的主意?

4 个答案:

答案 0 :(得分:3)

您要查找的功能是字符串粘贴。相邻的字符串常量将由编译器组合-您不需要运算符。

#define f(g, h) (g h)

请记住,此技巧仅适用于字符串常量。它不适用于变量。

答案 1 :(得分:2)

比我想的要简单。我在一个旧项目中发现的。

#include<stdio.h>

#define macro_custom "x_custom1_"

struct parameter_struct{
    char *parameter_name;
    int parameter_value;
};

int main(){
  struct parameter_struct param1= {macro_custom"param1", 6};
  printf("parameter name : %s\n", param1.parameter_name);
  return 0;
}

答案 2 :(得分:2)

可以通过这种方式串联字符串文字<div id="content">0</div>

宏函数可以连接两个字符串文字-"str1""str2"

关于变量,您可以使用#define STRCAT(str1, str2) str1##str2

更有效的方法是使用字符串管理实用程序,例如GString。 它跟踪字符串的结尾,并为您处理内存扩展。 跟踪字符串的结尾始终是免费的操作,因为无论如何在复制时总是到达结尾。

另一种方法是使用strcat()查找strchr(),然后使用常规方法在此偏移量加上一个字节向前的情况下复制字符串。


此外,我认为如果需要在编译/预处理程序中声明字符串连接(下面的注释对所发生的确切阶段有所启发),OP的问题会更加清楚。 这些概念揭示了整个不同的宇宙。

答案 3 :(得分:0)

尝试使用“#”预处理运算符,该运算符会将宏参数转换为字符串常量。

#define NEW_PARA_STRUCT(paramx, value) struct parameter_struct paramx={(macro_custom #paramx), value}

示例:

#include <stdio.h>

#define macro_custom "x_custom1_"
#define f(g,h) (g h)

#define NEW_PARA_STRUCT(paramx, value) struct parameter_struct paramx={(macro_custom #paramx), value}

struct parameter_struct{
    char *parameter_name;
    int parameter_value;
};

int main(){
  struct parameter_struct param1= {f(macro_custom, "param1"), 6};
  NEW_PARA_STRUCT(param2, 7);

  printf("parameter name : %s\n", param1.parameter_name);
  printf("parameter name : %s\n", param2.parameter_name);
  return 0;
}