gpt4 book ai didi

c - 检测预处理器宏中的空参数

转载 作者:行者123 更新时间:2023-12-02 07:44:32 25 4
gpt4 key购买 nike

我在 vanilla C 中有以下宏函数:

#define GLOG(format_string, ...) { \
const char *file = strrchr(__FILE__, '/'); \
char format[256] = "%s:%s!%d\t"; \
strncat(format, format_string, 248); \
strcat(format, "\n"); \
printf(format, __FUNCTION__, file ? file : __FILE__, __LINE__, ##__VA_ARGS__); \
}

它让我打印包含当前函数、文件和行号的调试消息,例如

GLOG("count=%d", count);

可能打印

do_count:counter.c!123  count=456
  1. 如果调用方省略 format_string,我如何修改函数以打印所有局部变量?例如

    GLOG();

    可能打印

    do_count:counter.c!123  count=456, message="Hello world", array=[7, 8] structure={ptr=0xACE0FBA5E, coord={x=9, y=0}}
  2. 如果这不可能,我如何修改它以仅打印当前函数、文件和行号?例如

    do_count:counter.c!123

    照原样,这会返回一个错误:

    error: expected expression before ‘,’ token

    strncat 行很简单

    strncat(format, , 248);

最佳答案

首先,进程本身在运行时检查所有局部变量似乎是不可能的,因为 C 没有任何反射方法。

其次,如果您像这样编写日志记录宏,您会过得更好:

#include <stdio.h>

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

#define GLOGF(fmt, ...) \
printf("%s:%s " fmt "\n", __func__, __FILE__ "!" TOSTRING(__LINE__), ##__VA_ARGS__)

int main (void) {
/* main:test.c!xx count=5 */
GLOGF("count=%d", 5);
/* main:test.c!xx */
GLOGF();
return 0;
}

它更简单并且不会产生任何额外的运行时开销,因为字符串是在编译时连接的。

另请注意,我使用了 __func__ 而不是 __FUNCTION__,因为后者是非标准的。

关于c - 检测预处理器宏中的空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7953784/

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