gpt4 book ai didi

c - __func__ 和 __FUNCTION__ 指针是否持久?

转载 作者:行者123 更新时间:2023-12-05 02:17:56 46 4
gpt4 key购买 nike

对于 gcc 项目,__FUNCTION____FILE____func__ 返回的指针是否保证指向持久内存? (也就是说,我可以安全地引用另一个函数范围内的指针吗?)我知道 __func__ 应该像 const char __func__ = "filename" 在函数的开头,这意味着“文件名”指向程序数据段中的某些内容,因此指针在函数之外应该是有效的。其他的是字符串,同样,它们应该在数据部分中创建条目。话虽这么说,我不相信它,我想知道这里是否有人可以确认这个假设是否正确。

例如:

struct debugLog_t {
const char * func;
const char * file;
const char * function;
uint32_t line;
int val;
} log;

struct debugLog_t someLog = {};

someFunc() {
// create debug log:
if (x) {
//uh oh...
someLog.func = __func__;
someLog.function = __FUNCTION__;
someLog.file = __FILE__;
someLog.line = line;
someLog.val = val;
}
}

void dumpSomeLog() {
printf("%s(%s) -- %s.%d: error val is x\n",
someLog.function, someLog.func, someLog.file, someLog.line,
someLog.val);
}

我想这样做是为了减少记录调试日志的内存/处理时间。

最佳答案

我不会调用那个持久内存(阅读 persistence 上的维基页面),而是只读 code segment 中的内存(或部分) .

是的,__func____FUNCTION____FILE__ 去那里(作为 static const char[] 数组) ;像文字字符串。

请注意,像 "ab" 这样的文字字符串的两次出现可能会或不会被编译到相同的地址(同样,"bc" 可能等于也可能不等于指针 "abc"+1)。对于两次出现的 __FILE__ 同样如此;然而,在 same 函数中,所有出现的 __func__ 都应该有相同的地址。

使用 GCC(至少在 -O1 优化),相同内容的文字常量字符串共享相同的位置。我什至相信在函数 foo 中,__func__"foo" 可能共享相同的地址(但对于 GCC,他们不这样做,甚至在 -O2)。您可以通过使用 gcc -fverbose-asm -S -O1 进行编译并查看生成的 *.s 汇编程序文件来进行检查。

例如:

 const char*f(int x) { 
if (x==0) return "f";
if (x>0) return __func__;
return __FUNCTION__;
}

使用 gcc -O -fverbose-asm -S 编译(在 Linux/Debian/Sid/x86-64 上使用 GCC 7)作为

    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "f"
.text
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
# f.c:2: if (x==0) return "f";
leaq .LC0(%rip), %rax #, <retval>
testl %edi, %edi # x
je .L1 #,
# f.c:3: if (x>0) return __func__;
testl %edi, %edi # x
# f.c:4: return __FUNCTION__;
leaq __func__.1795(%rip), %rax #, tmp94
leaq __FUNCTION__.1796(%rip), %rdx #, tmp95
cmovle %rdx, %rax # tmp94,, tmp95, <retval>
.L1:
# f.c:5: }
rep ret
.cfi_endproc
.LFE0:
.size f, .-f
.section .rodata
.type __FUNCTION__.1796, @object
.size __FUNCTION__.1796, 2
__FUNCTION__.1796:
.string "f"
.type __func__.1795, @object
.size __func__.1795, 2
__func__.1795:
.string "f"
.ident "GCC: (Debian 7.2.0-8) 7.2.0"

即使使用 -Os-O3,我也会在代码段中获得三个不同的位置。

但是Clang 5 与 -O3(甚至 -O1)合并所有三个 "f"__FUNCTION__ __func__ 将它们放在同一位置(并通过删除它来优化测试):

    .type   f,@function
f: # @f
.cfi_startproc
# BB#0:
movl $.L.str, %eax
retq
.Lfunc_end0:
.size f, .Lfunc_end0-f
.cfi_endproc
# -- End function
.type .L.str,@object # @.str
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "f"
.size .L.str, 2

因此,您关心的指针是指向代码段中的static const char[] 的指针,但您不应总是期望__func__ 具有相同的地址>__FUNCTION__(即使可能)。

关于c - __func__ 和 __FUNCTION__ 指针是否持久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532534/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com