0

我正在使用帮助类以一种简单的方式在 android ndk 中记录消息。它是这样工作的:

LOGE("ClassTag", "Message");

由于我不想每次要记录某些内容时都手动编写标签,因此我为每个类定义定义了一个 TAG 常量:

#define  TAG    "Class1Tag"

然后我可以通过以下方式登录:

LOGE(TAG, "Message");

当具有已定义 TAG 常量的类包含另一个具有相同 TAG 常量声明的类时,就会出现问题。然后弹出如下编译错误:

error: "TAG" redefined

如何在不必为每个#define 使用不同标识符的情况下摆脱重新定义?

4

4 回答 4

2

听起来您正在头文件中定义 TAG 值。为了让这种类型的东西正常工作,你应该只在实现文件中定义它。因为实现文件不包含在其他文件中,所以不会重新定义。

这意味着日志记录语句只能出现在实现文件中。

于 2013-03-10T18:47:12.340 回答
1

在各自的 .cpp 文件中而不是在标题中定义它们。

或者使用私有、静态、常量std::string或数组char,这将允许您在标题中使用日志记录语句,同时对其他类不可见。

于 2013-03-10T18:46:44.820 回答
1

如果你在几个不同的头文件中定义了相同的标识符,你就不可能得到你想要的行为。在给定的实现文件中,标识符的值将是最后一个定义的,不一定是与类关联的那个。“最后一个定义”将是包含在实现文件中的最后一个头文件中的那个,例如

啊:

#define TAG "ClassA"

:

#define TAG "ClassB"

一个.cpp:

#include "a.h"
#include "b.h"

对于此示例,在 a.cpp 中使用 TAG 将具有值“ClassB”。

基本上,您永远不想在头文件中重新定义标识符。如果您在实现文件中定义的标识符与另一个实现文件中的标识符相同,则可以使用,因为在编译其他实现文件时它不可见。但是编译器抱怨是有原因的,你应该注意它告诉你的内容以避免混淆。

编辑:我知道您的编译器将其标记为错误;我所说的结果是不要放松你的编译器抱怨来接受你所拥有的,因为这可能会导致混乱。

于 2013-03-10T18:52:31.213 回答
0

为什么#under TAG以前不使用#define TAG "ClassTag"

于 2013-03-10T18:46:49.173 回答