我正在将项目从Linux迁移到Xcode,我遇到了“版本”问题..
我在编译时需要一个唯一的标识符用于我的动态内容,在Linux上我使用的是__ COUNTER__预处理器,但似乎Xcode中使用的gcc 4.2还不知道__ COUNTER__ ...
所以,我想知道我能做些什么来解决这个问题?
我可以通过使用macports.org或类似的东西将GCC升级到4.3(理解__ COUNTER__)...我在OSX上非常棒,在linux上不是很好= [
或者找到另一种方法来实现这一点,在这种情况下,一种为函数/变量赋予唯一标识符的方法。我尝试了__ LINE__但是几天之后,你最终在不同文件的同一行上声明了一些内容,并且使用它就不那么具有生产力......
任何帮助表示赞赏!
谢谢,
乔纳森
答案 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 {
};
我的计数器问题是命名空间被用在很多类上,因此,在命名空间宏中创建相同的变量名,并且通过使用上面的新方法,我不再需要计数器......
感谢您的帮助,
乔纳森