0

我想要实现的是创建代码中提到的这三个类,但只是尝试方便地使用预处理器,以便可以创建和执行这些类似的类,而不是为它们编写单独的代码:

#include <iostream>
#define MYMACRO(len,baselen)
using namespace std;

class myclass ## len
{
    int MYVALUE ## baselen;
    public:
        myclass ## len ## ()
        {
            cout << endl;
            cout << " For class" ## len ## "'s function 'myFunction" ## len ## "' the value is: " << MYVALUE ## baselen << endl;
        }
};

int main()
{
    MYMACRO(10,100)
    //myclass10 ob1;
    MYMACRO(20,200)
    //myclass20 ob2;
    MYMACRO(30,300)
    //myclass30 ob3;

    myclass10 ob1;
    myclass20 ob2;
    myclass30 ob3;

    cout << endl;

    return 0;
}

现在我不知道它是否可以完成,因为我收到了这个错误。如果是,那么请有人解决错误并启发我,如果不是,请给出相同的原因,这样我也确信我们在同一页上!错误是:

[root@localhost C++PractiseCode]# g++ -o structAndPreprocessor structAndPreprocessor.cpp
structAndPreprocessor.cpp:5: error: invalid token
structAndPreprocessor.cpp:6: error: invalid function declaration
structAndPreprocessor.cpp:7: error: invalid token
structAndPreprocessor.cpp:9: error: invalid token
structAndPreprocessor.cpp:9: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp:12: error: invalid token
structAndPreprocessor.cpp: In function `int main()':
structAndPreprocessor.cpp:25: error: `myclass10' was not declared in this scope
structAndPreprocessor.cpp:25: error: expected `;' before "ob1"
structAndPreprocessor.cpp:26: error: `myclass20' was not declared in this scope
structAndPreprocessor.cpp:26: error: expected `;' before "ob2"
structAndPreprocessor.cpp:27: error: `myclass30' was not declared in this scope
structAndPreprocessor.cpp:27: error: expected `;' before "ob3"
[root@localhost C++PractiseCode]#
4

2 回答 2

5

您需要\在行的每一端使用来定义您的宏(并可能从宏中删除 using 语句)

using namespace std;

#define MYMACRO(len,baselen) \
class myclass ## len \
{ \
    int MYVALUE ## baselen; \
(...snip...)       \
   }\
}; 

注意最后一行没有转义

很可能你正在做 Cpp 并且不鼓励使用宏。您最好使用模板或传统的动态代码(取决于您的需要)。与宏相比,模板在编译时带来了额外的类型检查,并提供了更具可读性的错误消息。

于 2013-11-07T08:08:56.687 回答
0

您提供的宏观解决方案是我以前使用过的解决方案,但我会以不同的方式看待这个问题。宏解决方案对于除了最琐碎的代码之外的所有代码都是笨重且难以维护和调试的。

您是否考虑过从模板生成所需的代码?使用 Cheetah 或 Mako 来填写源模板会更干净一些,并且您可以从配置文件驱动生成,因此您不必手动维护您的类列表。

您将拥有一个看起来像这样的 myclass.tmpl 模板文件:

#for len, baselen in enumerate(mylist_of_classes_i_want_to_generate)
class MyClass$len
{
    int MYVALUE$baselen;
    public:
        MyClass$len()
        {
            cout << endl;
            cout << " For class $len's function 'myFunction $len' the value is: " << MYVALUE$baselen << endl;
   }
};
#end for

然后在编译之前调用 cheetah 在构建流程开始时自动生成代码。

于 2013-11-07T08:28:51.857 回答