1

我有一个宏函数,它带有一个名称,旨在从各种命名空间中调用。我想确保此名称在全球范围内是唯一的。定义看起来像这样:

#define DECLARE_NEW_MYVAR( Name ) static MyVar Name( #Name )

我希望这个静态变量被命名空间(这就是为什么我希望从各种命名空间调用它),但我还需要确保传递给 MyVar 的构造函数的字符串是全局唯一的。这是因为我要序列化这个值并且我需要能够正确地将它关联回来。

我尝试了一些没有成功的事情:

强制它是唯一的:根据一些信息在名称上附加一些东西来强制它是唯一的

  • 使用__COUNTER__宏:我的目标编译器之一没有这个宏。此外,假设调用宏的顺序相同似乎很危险
  • 使用__FILE__宏:它具有完整的文件路径,可以确保它是唯一的,但是如果从不同的地方或不同的机器编译,反序列化将不再起作用。

检查它是否是唯一的:将它留给调用者让它是全局唯一的,如果不是,让编译器抱怨

  • 我正在寻找一种方法来从命名空间内声明全局命名空间中的某些内容,这样如果它们不使其唯一,我至少可以导致多重定义的符号。我想不出办法来做到这一点。

基本上我需要想出一个全局唯一的字符串来传递给 MyVar ,我可以相信它不会在不同的编译之间发生变化,最好不会在代码更改之间发生变化(只要特定调用没有改变)。

有谁知道如何做到这一点?

4

1 回答 1

1

您可以像这样删除项目目录的前缀__FILE__

#include <cstring>
#include <iostream>

#define COMMON_PATH_PREFIX "/home/user/path/to/project/"

#define UNIQUE_IDENTIFIER() (__FILE__ + std::strlen(COMMON_PATH_PREFIX))

void someFunction(const char *identifier)
{
    std::cout << identifier << std::endl;
}

int main()
{
    someFunction(UNIQUE_IDENTIFIER());
}

COMMON_PATH_PREFIX可以由您的#define构建系统生成。例如,如果您使用 CMake,您可以简单地使用CMAKE_SOURCE_DIRECTORY.

调用std::strlen()应该由编译器优化,因为字符串是常量并且在编译时是已知的。

当然,这仅在您只想为每个文件声明一个变量时才有效。您也可以添加__LINE__到标识符中,但是如果您更改代码,则标识符更有可能发生变化。

于 2012-10-05T16:32:00.923 回答