在这种情况下比较字符串指针是否有效?

时间:2012-12-12 03:40:42

标签: c memory-management static

在我的C应用程序中,我有一个与此类似的日志记录方法:

void logError(const char* module, const char* message, ... );

调用此方法时,调用者通常会执行以下操作:

logError("foo", "bar");

// or even

#define FOOMODULE "foo"
logError(FOOMODULE, "bar");

无论char*模块如何传入,char*都是存储在应用程序二进制文件中的静态内存。

我的问题是,编译器/链接器是否将静态声明的字符串的所有实例都折叠为单个声明?因此,假设比较我的静态声明字符串的指针("foo" == FOOMODULE)将始终按预期工作是有效的(当然,假设字符串 等同于我的上面的示例,并且确实在应用程序的二进制文件中静态分配了吗?

我正在研究在日志消息进入时对其进行过滤的方法。例如,我可能只想查看来自单个“模块”的日志消息。在决定是否要实际打印给定的日志消息时,比较指针而不是字符串中的每个字节会很棒。

谢谢!

2 个答案:

答案 0 :(得分:3)

它通常会起作用,但保证,不应使用这样的比较。

答案 1 :(得分:2)

我将故意给出一个不同的答案。

如果要执行此操作,请编写可靠的测试用例,因为这是否有效取决于编译器和启用的优化。该标准允许但不需要重复删除字符串常量。