__COUNTER__相当于Xcode?

时间:2010-06-28 02:18:53

标签: c++ xcode gcc uniqueidentifier counter

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

我在编译时需要一个唯一的标识符用于我的动态内容,在Linux上我使用的是__ COUNTER__预处理器,但似乎Xcode中使用的gcc 4.2还不知道__ COUNTER__ ...
所以,我想知道我能做些什么来解决这个问题? 我可以通过使用macports.org或类似的东西将GCC升级到4.3(理解__ COUNTER__)...我在OSX上非常棒,在linux上不是很好= [
或者找到另一种方法来实现这一点,在这种情况下,一种为函数/变量赋予唯一标识符的方法。我尝试了__ LINE__但是几天之后,你最终在不同文件的同一行上声明了一些内容,并且使用它就不那么具有生产力......

任何帮助表示赞赏!

谢谢,
乔纳森

2 个答案:

答案 0 :(得分: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会相当奇怪。

答案 1 :(得分:0)

@ stinky472:我使用的代码接近你上面写的代码......

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

newclass(a :: b,c):public d {

};

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

感谢您的帮助,
乔纳森