【发布时间】:2016-05-07 16:49:13
【问题描述】:
我想编写一个低级的日志记录函数,如下所示:
DO_DBG("some string", val1, val2)
出于性能原因,我想要它做的是存储指向字符串的指针而不是字符串的副本。这假定字符串是只读文字。为了防止人们不得不调试调试器,如果DO_DBG 的第一个参数位于代码与文本的可写部分等情况下,如果编译器可以抱怨,那就太好了。我想知道是否存在这样做的机制。 (我使用的是 gcc 4.9.1,ld 2.24)。
【问题讨论】:
-
如果任意变量或字符串文字是只读的? C 标准保证字符串文字是只读的。但是,如果相等的字符串存储在同一地址,则由实现定义。
-
是的,但是如果有人尝试将字符串文字以外的任何内容作为函数的第一个参数传递,我希望编译器编译失败。该函数将采用
const char *参数,我想知道它是否是文字... -
这似乎是在规避未定义的行为并将其替换为“更安全”的东西,例如编译时错误。我认为不修改编译器/打破 C 标准是不可能的。
-
无论参数是字符串文字还是数组,您的函数都将获得一个指针。除非您担心并发修改,否则我不确定我是否看到了好处。
-
@cad 标准不保证字符串文字是只读的,它说写入它们具有未定义的效果