c++ - 带有时间戳的自定义打印功能给出警告

标签 c++ c timestamp printf

我制作了一个自定义打印函数,它打印带有时间戳的消息。但是当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以正常编译,但我有点被这个错误所困扰,因为编译器还说这可能是不安全的,所以我想修复它。

void Log(const char *message, ...)
{
    time_t rawtime;
    struct tm* timeinfo;
    char timestamp[11];

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(timestamp, 11, "%X: ", timeinfo);

    fprintf(stdout, timestamp); // format not a string literal and no format arguments [-Wformat-security]

    va_list args;
    va_start(args, message);
    vfprintf(stdout, message, args);
    va_end(args);
    fprintf(stdout, "\n");
}

我尝试将 timestamp 更改为 const char*strftime 不接受它并且警告仍然存在。

我该如何解决这个问题,有什么方法可以优化这个函数(因为我对 C IO 库 了解不多)?

最佳答案

fprintf(stdout, timestamp);

fprintf 用于由格式字符串定向的格式化输出。不带参数但格式字符串的调用有点误用,而且启动速度很慢。为了安全地使用 fprintf,您应该使用 fprintf (stdout, "%s", timestamp);

或者,只需使用 fputs (timestamp, stdout); 这将绕过格式字符串的解析,并按原样将字符串打印到标准输出。这正是您想要的,而且速度更快,因为 fputs 不解析要打印的字符串。

关于c++ - 带有时间戳的自定义打印功能给出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391528/

相关文章:

c - 需要以状态机的方式编写算法,但变得非常难读

php - 如何在 PHP 中格式化来自 MySQL 的时间戳?

php - MySQL TIMESTAMP 列在更新时使用什么时区?

grails - Grails-为什么setDateCreated被多次调用?

c++ - 如何在C++中实现一个简单的多线程FileLogger?

c++ - 使用 Direct x 创建球形网格?

c - 在堆栈中使用 “push” 和 “pop”

c++ - Windows 7 64位/Visual Studio 2008/OpenCV2.1错误: "The application was unable to start correctly (0xhex).."

c++ - 用A*算法遍历图

java:符号查找错误: undefined symbol :fftw_malloc