3

我正在将一个项目从 Linux 迁移到 Xcode,但遇到了“版本”问题。

我在编译时需要一个唯一标识符来处理我的动态内容,在 linux 上我使用的是 __ COUNTER__ 预处理器,但似乎 Xcode 中使用的 gcc 4.2 还不知道 __ COUNTER__ ......
所以,我想知道什么我能做些什么来解决这个问题? 我可以通过
使用 macports.org 或类似的东西将 GCC 升级到 4.3(它理解 __ COUNTER__)......
在这种情况下,一种为函数/变量提供唯一标识符的方法。我尝试使用 __ LINE__ 但几天后,您最终会在不同文件的同一行上声明内容,并且使用它并没有那么高产......

任何帮助表示赞赏!

谢谢,
乔纳森

4

2 回答 2

1

我需要对项目中使用的所有类进行编目,因此可以在工厂中动态创建这些类 [...]

没有使用 RTTI(如果你被允许这样做,这不是一个坏主意; boost::any 这样做),只使用字符串作为类名怎么样?您可以通过宏检索它。

#include <iostream>
#include <string>
using namespace std;

template <class T>
const char* my_type_id()
{
    return "Unknown";
}

#define REGISTER_TYPE(some_type)            \
    template <> inline                      \
    const char* my_type_id<some_type>()     \
    {                                       \
        return #some_type;                  \
    }

REGISTER_TYPE(int)
REGISTER_TYPE(std::string)

int main()
{
    // displays "int"
    cout << my_type_id<int>() << endl;

    // displays "std::string"
    cout << my_type_id<string>() << endl;

    // displays "Unknown" - we haven't registered char
    cout << my_type_id<char>() << endl;
}

这种方法最好的一点是,您不必担心使用这种方法跨翻译单元或模块的问题。唯一需要注意的是名称冲突,在这种情况下,您可以指定一个名称空间来帮助避免它们(“std::string”,而不是简单的“string”,例如)。

我们将此解决方案用作我们通过 SDK 提供的 boost::any 的替代方案(因此不能使用 boost,因为它需要我们的用户安装 boost 或让我们运送部分 boost,在这种情况下它可能会导致对于安装了不同版本的 boost 的用户的冲突)。它不像 boost::any 那样自动,因为它需要手动注册支持的类型(在这方面更接近 boost::variant),但不需要我们的 SDK 用户启用 RTTI 并且可以跨模块边界可移植地工作(I'我不确定是否可以依赖 RTTI 在不同的编译器、设置和模块中生成相同的信息——我对此表示怀疑)。

现在,您可以随意使用这些类型关联的字符串 ID。一个示例是使用它将创建函数映射到这些字符串 ID,以便您可以创建 std::string 的实例,例如,通过 factory::create("std::string"); 请注意,这只是出于演示目的的假设情况,因为使用工厂创建 std::string 会很奇怪。

于 2010-06-29T00:44:29.993 回答
0

@stinky472:我使用的代码与您在上面编写的代码相近...

我的问题是我使用宏来声明项目的命名空间,因此,拥有类的全名,就像类 c 在 a::b::c 中一样。
我所做的是将我的代码更改为不依赖于命名空间本身,而是在类宏声明中添加一个新参数来告诉它正在使用什么命名空间,例如:

新类(a::b,c):公共 d{

};

我对计数器的问题是命名空间被用于许多类,因此,在命名空间宏中创建相同的变量名,并且通过使用上面的新方法,我不再需要计数器了......

谢谢你的帮助,
乔纳森

于 2010-07-03T02:25:50.083 回答