【问题标题】:Is comparing pointers of strings valid in this case?在这种情况下比较字符串的指针是否有效?
【发布时间】:2012-12-12 03:40:41
【问题描述】:

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

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

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

logError("foo", "bar");

// or even

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

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

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

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

谢谢!

【问题讨论】:

    标签: c memory-management static


    【解决方案1】:

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

    【讨论】:

    • 那么当在目标 c 中,Apple 比较指向字符串的指针(它们是方法名称),内存是动态分配的吗?这值得自己的问题......
    • 也许是某种链接来支持这一点?
    【解决方案2】:

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

    如果您要这样做,请编写可靠的测试用例,因为这是否有效取决于编译器和启用的优化。该标准允许但不要求对字符串常量进行重复数据删除。

    【讨论】:

    • 测试一些你知道是不可预测的东西有什么意义?测试对于确保您正确使用了应该是可预测的东西是有意义的。但是,找出我们所知道的不可预测的事物在某些条件组合下的行为是没有意义的,因为我们已经知道我们不能依赖它。
    • 所以你知道失败的测试违反了约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2012-10-25
    • 1970-01-01
    • 2013-04-15
    • 2012-06-02
    相关资源
    最近更新 更多