C++ 将字符串与变量连接起来,并将其视为C/C++;

C++ 将字符串与变量连接起来,并将其视为C/C++;,c++,c++11,C++,C++11,我试图弄清楚如何编写一个宏,将变量的值附加到字符串中。这是一段不工作的代码,但我展示它是为了解释我想做什么 #include <iostream> #include <string> #include <sstream> using namespace std; #define DATA_RESPONCE_0 23 #define DATA_RESPONCE_1 24 #define DATA_RESPONCE_2 25 #define DATA_

我试图弄清楚如何编写一个宏,将变量的值附加到字符串中。这是一段不工作的代码,但我展示它是为了解释我想做什么

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

#define  DATA_RESPONCE_0 23
#define  DATA_RESPONCE_1 24
#define  DATA_RESPONCE_2 25
#define  DATA_RESPONCE_3 26

#define my_macro(x) DATA_RESPONCE_##x


int main() {

    int i = 0;
    int k;

    k = my_macro (i);

    cout << k;

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#定义数据\u响应\u 0 23
#定义数据\u响应\u 1 24
#定义数据响应2 25
#定义数据\u响应\u 3 26
#定义我的_宏(x)数据_响应_35;##x
int main(){
int i=0;
int k;
k=我的_宏(i);

cout不能使用宏。预处理(即宏展开时)是编译的第一步。早在知道
i
的值之前

如果要将运行时值映射到某个对象,请使用适当的函数:

int my_function(int x)
{
  static const int map[] = {
    DATA_RESPONCE_0,
    DATA_RESPONCE_1,
    DATA_RESPONCE_2,
    DATA_RESPONCE_3
  };

  assert (x >= 0 && x < sizeof(map)/sizeof(map[0]));
  return map[x];
}
适当范围的
enum类
将减少对全局命名空间的污染。甚至可以进一步对其本身进行命名空间设置。它优于不能使宏尊重命名空间或作用域的宏

data_response my_function(int x)
{
  static const data_response map[] = {
    data_response::type_0,
    data_response::type_1,
    data_response::type_2,
    data_response::type_3
  };

  assert (x >= 0 && x < sizeof(map)/sizeof(map[0]));
  return map[x];
}
data\u response my\u函数(int x)
{
静态常量数据_响应映射[]={
数据\u响应::类型\u 0,
数据\响应::类型\ 1,
数据\响应::类型\ 2,
数据\u响应::类型\u 3
};
断言(x>=0&&x
不能使用宏。预处理(即宏展开时)是编译的第一步。早在知道
i
的值之前

如果要将运行时值映射到某个对象,请使用适当的函数:

int my_function(int x)
{
  static const int map[] = {
    DATA_RESPONCE_0,
    DATA_RESPONCE_1,
    DATA_RESPONCE_2,
    DATA_RESPONCE_3
  };

  assert (x >= 0 && x < sizeof(map)/sizeof(map[0]));
  return map[x];
}
适当范围的
enum类
将减少对全局命名空间的污染。甚至可以进一步对其本身进行命名空间设置。它优于不能使宏尊重命名空间或作用域的宏

data_response my_function(int x)
{
  static const data_response map[] = {
    data_response::type_0,
    data_response::type_1,
    data_response::type_2,
    data_response::type_3
  };

  assert (x >= 0 && x < sizeof(map)/sizeof(map[0]));
  return map[x];
}
data\u response my\u函数(int x)
{
静态常量数据_响应映射[]={
数据\u响应::类型\u 0,
数据\响应::类型\ 1,
数据\响应::类型\ 2,
数据\u响应::类型\u 3
};
断言(x>=0&&x
宏是在编译时展开的。在程序的某个给定进程的某个给定执行过程中,在某个给定时间点的变量值在编译时是未知的。因此,宏无法执行该任务

因为据说您有严重的内存限制,所以只需更换

k = my_macro (i);

在那里


如果“数据响应”值需要更为任意,请考虑使用数组:

int const data_response[] = {23, 25, 25, 82};
k = data_response[i];
另一种方法是使用
switch
语句,但它可能会占用更多内存



如果
i
的值可以是非连续的,那么您需要对内存使用情况、代码复杂度以及对该值的需求做出一些工程决策。例如,
std::map
从技术上来说可以是一个解决方案,但在内存紧张的情况下,它可能远远不理想。

宏在compile时间。在程序的某个给定进程的某个给定执行过程中,在某个给定时间点的变量值在编译时是未知的。因此,宏无法执行该任务

因为据说您有严重的内存限制,所以只需更换

k = my_macro (i);

在那里


如果“数据响应”值需要更为任意,请考虑使用数组:

int const data_response[] = {23, 25, 25, 82};
k = data_response[i];
另一种方法是使用
switch
语句,但它可能会占用更多内存



如果
i
的值可以是非连续的,那么您需要对内存使用情况、代码复杂度以及对该值的需求做出一些工程决策。例如,
std::map
从技术上来说可以是一个解决方案,但在内存紧张的情况下,它可能离理想状态很远。

不,您不能这样做。为什么您认为需要这样做吗?最接近的方法是将
DataResponse
制作成一个数组(而不是宏),并使用
DataResponse[i]
。您应该看看。但是,您正试图在预处理器中使用一个在运行时设置的变量,它主要在编译时处理常量。如果您想使用
my\u宏(0)
,然后您可以使用该问题中的技术来获得所需的结果。使用像
i
这样的变量是行不通的。@Raindrop7编译器也不知道该值。这是运行时。不,您不能这样做。您认为为什么需要这样做?最接近的方法是使
数据响应
成为array(不是宏),并使用
DataResponse[i]
。您应该查看。但是,您正在尝试在预处理器中使用一个在运行时设置的变量,该变量主要在编译时处理常量。如果要使用
my_宏(0)
,然后您可以使用该问题中的技术来获得您想要的结果。使用像
i
这样的变量是行不通的。@Raindrop7编译器也不知道该值。这是运行时。最好将其设置为
const
。很酷,上面使用enum的方法似乎对我很有帮助。但是添加其他数组会消耗大量时间我的小微控制器的内存。@user7377995-你不测试就不能确定。此外,你唯一的选择是开关(恶心),并且它将在代码中消耗同样多的内存:)最好将其设置为
const
。酷,上面使用enum的方法似乎对我很有帮助。但是添加其他数组将消耗我的小型微控制器的内存。@user7377995-不经测试您无法确定。此外,您唯一的其他选项是开关(恶心),它将在代码中消耗同样多的内存:)