当 Zed Shaw 的 C 书籍“Learn C the Hard Way”免费阅读时,我在他的网站上找到了他的调试宏。它最初是为 Linux 设计的,并且运行良好,已经使用了一段时间。
现在,我已经开始为 Windows 编写 C 代码并且我正在使用 Visual Studio。我想在我正在处理的项目中使用这些调试宏。
问题如下:假设我想使用检查宏来确保函数返回没有错误。
display = al_create_display(640, 480);
check(display, "Failed to create display");
将使用的宏定义如下:
#define clean_errno() (errno == 0 ? "None" : strerror(errno))
#define log_err(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
#define check(A, M, ...) if(!(A)) { log_err(M, ##__VA_ARGS__); errno=0; goto error; }
但是,我遇到的问题是 Visual Studio 标记strerror()
为已弃用并中止编译。我计划在项目中使用线程,所以如果可能的话,我不想走“忽略”路线。
我所做的是创建了一个clean_errno()
与宏执行相同操作的函数,但使用全局缓冲区变量并调用strerror_s()
复制到其中,然后返回指向log_err()
宏的指针。但是现在我必须:
- 要么为这个 3-liner 函数创建一个全新的头文件和 C 文件,我认为这很丰富
- 或者我只是在调试宏的头文件中声明和实现该函数,这根本不被认为是好的 C 实践,而且也很丑陋。
是否有任何其他我不知道的技巧/黑客可以为此提供优雅而简单的解决方案?