- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将一个项目从 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/
如果我们使用 __COUNTER__在两个不同的源文件中,该值将重置为零。是否可以制作 __COUNTER__范围全局? 文件:file1.c int x=__COUNTER__; int y=__C
我看到这个问题: How to generate random variable names in C++ using macros? 回答如下:https://stackoverflow.com/a
我的电脑上安装了两个版本的 C++ 编译器。其中一个可以识别 __COUNTER__ 宏,而另一个则不能。在做了一些研究以使程序在两者中编译之后,我还没有遇到 __COUNTER__ 的宏定义。这是编
我正在做一些模板元编程,大部分只是编写我自己的编译时间列表,但我也有一些预处理器魔法,如果可能的话,我想用它来使事情变得更容易。 我想做的是创建仿函数的编译时列表。该部分已完成,但用于简化创建(并添加
我有一段代码使用 __COUNTER__ 宏来为变量生成唯一的名称。 此代码可移植吗?我知道 GCC 和 MSVS 支持它。其他编译器呢?宏是由标准定义的吗(据我所知,在 C++14 之前它不是)。
我正在尝试使用 __COUNTER__ 宏在我的代码中生成唯一的变量名。但是宏似乎不起作用。我可能以错误的方式使用它。请就我做错的地方向我提供指示或建议。 #define DUMB_MACRO() h
我想生成对编写单元测试用例有用的不同命名函数。我想这样做基本上是为了给每个单元测试用例赋予唯一的名称。 我正在使用 google 测试框架 编写单元测试用例。我必须使用 TEST_Macro 来编写单
我在玩预处理器和 c。尝试实现我自己的事件和层次结构系统。但是我遇到了一个问题。我正在尝试静态定义可以初始化的“模块”,以及一些预先静态定义的事件。对于我使用的事件,COUNTER 效果很好。但我不想
我想对 __COUNTER__ 进行字符串化并将其打印为字符串而不是整数,这可能吗? printf("%s\n", #__COUNTER__); 下面的方法我都试过了,还是不行 hello.c:6:1
我有一个执行类似于以下操作的宏: #define MAKE_VALS(...) \ int val1 = 0; \ int val2 = 0; \ : if(val1
我正在尝试编写一个宏,它将每个源文件仅扩展一次 __COUNTER__ 宏。我完全理解宏是如何处理它们的扩展的,但我在这个方面遇到了困难。我想在文件顶部扩展一次 __COUNTER__ 宏,然后对该定
我正在将一个项目从 Linux 迁移到 Xcode,我遇到了“版本”问题。 我在编译时需要一个唯一标识符来处理我的动态内容,在 linux 上我使用的是 __ COUNTER__ 预处理器,但似乎 X
是否可以在头文件的开头重置 __COUNTER__ 宏,使其在头文件中的计算在多个编译单元上保持一致? 最佳答案 枚举怎么样? enum { COUNTER_BASE = __COUNTER__ };
我目前在我的 C 库代码中使用 __COUNTER__ 宏来生成唯一的整数标识符。它运行良好,但我看到两个问题: 它不属于任何 C 或 C++ 标准。 也使用 __COUNTER__ 的独立代码可能会
__COUNTER__ 符号由 VC++ 提供和 GCC,每次使用都会给出一个递增的非负整数值。 我有兴趣了解是否有人使用过它,以及它是否值得标准化? 最佳答案 __COUNTER__ 在您需要唯一名
这个问题在这里已经有了答案: Does C++ support compile-time counters? (11 个答案) 关闭 6 年前。 我有一组 C++ 类,每个类都必须声明一个唯一的顺序
我需要在编译时在整个代码中生成一系列序列号。我以这样的方式尝试了“__COUNTER__”: void test1() { printf("test1(): Counter = %d\n", __
在this presentation 在 00:19:00 左右,Andrei Alexandrescu 解释了他的 SCOPE_EXIT 宏的实现。他在堆栈上创建了一个 ScopeGuard 对象,
我遇到以下关于 __COUNTER__ 的词: Care must be taken to ensure that __COUNTER__ is not expanded prior to inclu
首先,让我从我正在尝试做的事情开始。我正在开发一个库,它可以更轻松地将 Python 解释器嵌入到 C++ 代码中,并且我想利用一些 C++11 功能。我大量使用 std::functions,这是一
我是一名优秀的程序员,十分优秀!