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-不经测试您无法确定。此外,您唯一的其他选项是开关(恶心),它将在代码中消耗同样多的内存:)