我正在学习C ++宏。现在我完全糊涂了。所以帮助我!下面是我的代码,我想要做的是使用C ++宏并使用“模板”调用不同的函数,这样我只能编写一个函数,这个函数可以用来为不同的类型做同样的事情。但是当我编译此代码时,它会抛出以下错误。
testCPP.cpp:在函数'void test_int_Macro(int)'中:
testCPP.cpp:14:错误:在'{'标记
之前不允许使用函数定义 testCPP.cpp:26:错误:输入结束时预期的`}'
#include<iostream>
#include<cstdint>
using namespace std;
#define Query_Data(Type)\
void test_##Type##_Macro(Type data){ \
cout<<"Test: "<<sizeof(data)<<" "<<endl; \
//cout<<"Type is "<<##Type##<<endl;\
}
Query_Data(int)
Query_Data(char)
int main(){
cout<<sizeof(unsigned)<<endl;
cout<<sizeof(char)<<endl;
cout<<sizeof(int32_t)<<endl;
int num=6;
char c='a';
Query_Data(num);
//Query_Data(c);
}
答案 0 :(得分:4)
在C ++中,宏非常简单而且很愚蠢。无论您在何处调用宏,该处理器都会简单地重新调整宏。
如果你在一张纸上进行预处理,你提出的是:
int main(){
cout<<sizeof(unsigned)<<endl;
cout<<sizeof(char)<<endl;
cout<<sizeof(int32_t)<<endl;
int num=6;
char c='a';
void test_num_Macro(Type data){
cout<<"Test: "<<sizeof(data)<<" "<<endl;
//cout<<"Type is "<<##Type##<<endl;
}
}
编译器给出了一条错误消息,在这种情况下是点亮的:
testCPP.cpp:14: error: a function-definition is not allowed here before '{' token
查看由于预处理而导致的main
函数。它有一个在其中声明的函数。显然,这是不允许的。
现在,如果我们按照这一思路进入下一个逻辑阶段,那么问题就变成了“那么我如何实现我想要实现的目标?”
你这么说:
我要做的是使用C ++宏并调用不同的 函数使用“模板”,这样我只能编写一个函数 而且这个功能可以用来做不同的事情 类型。
C ++中有一个设施正是如此。巧合的是,它们被称为模板。以下是您在此处使用的方法:
template <typename Val>
void test ()
{
cout << "Test: " << sizeof (Val) << " " << endl;
}
int main(){
cout<<sizeof(unsigned)<<endl;
cout<<sizeof(char)<<endl;
cout<<sizeof(int32_t)<<endl;
int num=6;
char c='a';
test <char> ();
test <int> ();
}
宏是一种淤泥。它们并不复杂,它们围绕C ++类型系统,它们很难调试和维护。除非您别无选择,否则通常建议您避免使用它们。有些地方你别无选择 - 但这不是其中之一。
答案 1 :(得分:2)
输入结束时“期望'}'错误的原因是宏中的注释行。预处理器将其视为空行(没有尾随),因此看起来不会更远,并且会使'}'脱离定义。
答案 2 :(得分:0)
除了#include
之外,你应该避免在C ++中使用预处理器,并在头文件中包含防护。
宏是简单的文本替换片段,因此您最终将在main
函数中定义这些函数,这是您在C ++中无法做到的事情。如果您通过预处理器运行代码,则可以很好地看到它:
void test_int_Macro(int data){ cout<<"Test: "<<sizeof(data)<<" "<<endl;
void test_char_Macro(char data){ cout<<"Test: "<<sizeof(data)<<" "<<endl;
int main(){
cout<<sizeof(unsigned)<<endl;
cout<<sizeof(char)<<endl;
cout<<sizeof(int32_t)<<endl;
int num=6;
char c='a';
void test_num_Macro(num data){ cout<<"Test: "<<sizeof(data)<<" "<<endl;;
}
这么说,你应该(也可能已经得到它)使用模板:
template <class Type>
void Query_Data(Type data) {
std::cout << "Test: " << sizeof(data) << " " << std::endl;
}
如果您愿意,可以将模板专门用于特定类型,例如:
template<>
void Query_Data<int>(int data) {
std::cout << "This is an integer!" << std::endl;
}
并按预期使用它们:
int main(){
cout<<sizeof(unsigned)<<endl;
cout<<sizeof(char)<<endl;
cout<<sizeof(int32_t)<<endl;
int num=6;
char c='a';
Query_Data(num);
Query_Data(c);
}