gpt4 book ai didi

c++ - __COUNTER__ 等同于 Xcode?

转载 作者:太空狗 更新时间:2023-10-29 23:09:56 25 4
gpt4 key购买 nike

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

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

感谢任何帮助!

谢谢,
乔纳森

最佳答案

I need to catalog all classes used in a project, so these classes can be created on the fly from within a factory [...]

如果不使用 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;
}

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

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

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

关于c++ - __COUNTER__ 等同于 Xcode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com