关于C ++预处理器的问题

时间:2014-07-18 18:09:36

标签: c++ c-preprocessor

我正在学习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);
}  

3 个答案:

答案 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)

约翰迪布林是对的。但我想指出调试预处理器问题的最简单方法通常是运行g ++ -E src.cpp,它会在预处理后显示该文件。 (首先删除你的#include,否则你的输出会太多)

输入结束时“期望'}'错误的原因是宏中的注释行。预处理器将其视为空行(没有尾随),因此看起来不会更远,并且会使'}'脱离定义。

答案 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);
}