gpt4 book ai didi

c - 在 C 中使用宏的 vsprintf 段错误

转载 作者:太空狗 更新时间:2023-10-29 15:40:04 24 4
gpt4 key购买 nike

我在 C 中创建了一个简单的记录器库。我有三个文件

我的示例文件:

  • 例子.c

库文件:

  • 逻辑库.h
  • 逻辑库.c

我的主要记录器函数称为 logme。我将不同的宏定义为包装器以指示不同的日志级别:

例如

  • 警告
  • 错误
  • 等..

在 example.c 中我调用宏:

int int_arg = 55;
WARN(1, "Warn message with level 1");
WARN(1, "Warn message with level %d", int_arg);

WARN宏在loglib.h中定义:

#define WARN(LEVEL, ...) \
logme(LEVEL, 8, " <%s:%d> inside %s() -- "__VA_ARGS__, __FILE__, __LINE__, __func__);

最后是 logme 函数:

void slog(int level, int flag, const char *msg, ...)
{
char string[10000];
bzero(string, sizeof(string));
va_list args;
va_start(args, msg);
vsprintf(string, msg, args);
va_end(args);

// .. do other things
}

当我运行示例文件时,这是我得到的:

inside main() -- Warn message with level 1

Segmentation fault (core dumped)

当我使用格式化字符串调用 WARN 时出现段错误。

段错误出现在vsprintf(string, msg, args);

是不是我的宏有问题?

这是我的 lib 的 make 文件:

CFLAGS = -g -O2 -Wall -lpthread
LIB = -lrt
OBJS = loglib.o

LIBINSTALL = /usr/local/lib
HEADINSTALL = /usr/local/include

.c.o:
$(CC) $(CFLAGS) -c $< $(LIB)

libslog.a: $(OBJS)
$(AR) rcs liblog.a $(OBJS)
@echo [-] Syncing static library
sync

install:
@test -d $(LIBINSTALL) || mkdir $(LIBINSTALL)
@test -d $(HEADINSTALL) || mkdir $(HEADINSTALL)
@install -m 0664 liblog.a $(LIBINSTALL)/
@install -m 0664 loglib.h $(HEADINSTALL)/
@echo [-] Done

loglib.o: loglib.h

.PHONY: clean
clean:
$(RM) liblog.a $(OBJS)

最佳答案

这行不通,因为您尝试将 __VA_ARGS__ 进行字符串连接这里:

#define WARN(LEVEL, ...) \
logme(LEVEL, 8, " <%s:%d> inside %s() -- "__VA_ARGS__, __FILE__, __LINE__, __func__);

这会打乱您的参数序列:__FILE__不会与 <%s 一起使用等。您必须重新定义您的 WARN()宏所以 __VA_ARGS__最后一个。如果你想在前面加上所有这些信息,你将不得不编写一个适当的可变参数函数。注意 __func__不是字符串文字,它引用适当的字符串。

关于c - 在 C 中使用宏的 vsprintf 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41791627/

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