c - 用于以不同类型打印变量值的最通用的 C 宏

标签 c macros debugging printing

请与我们分享您最喜欢的、最常用的 PRINT 或 DEBUG 宏 适用于所有(或几乎所有)不同类型的变量和 C 中的数组。宏 可以有任意数量的参数(尽管 1-3 是首选);如果它增加 完全没有描述能力,可以假定 C99 特征。

#define PRINT(var, ...) \
   ...

让我们开始吧!

最佳答案

对于C++,模板函数可以比宏强大得多。

template <typename T>
std::string tostring(const T& t);

模板参数的缺点是它不能区分 typedef 别名:

typedef LONG HRESULT;

对于 C,我认为如果不更改结构,您将无能为力。如果您可以控制结构定义,这里有两个技巧:

在struct的开头添加一个字段,并将该字段设置为唯一标识该结构类型的值,可供tostring函数使用,选择合适的打印代码.

typedef struct abcde
{
    int unique_struct_type_id; // assign this to a number that represents "abcde"
};

类似的方法是传入一个函数指针来打印结构。

struct abcde
{
    void (*print_fn) (abcde* p);  // assign this to the printing function for "abcde"
}
#define PRINT_STRUCT(s) s->print_fn(s)

关于c - 用于以不同类型打印变量值的最通用的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3572391/

相关文章:

c - size_t modulo long unsigned int 的意外结果

c - 如何使用 lldb 有效地回溯段错误?

c++ - 类似命名空间的宏功能

vim - 在 vim 的所有缓冲区中运行宏

c++ - #if 0 && defined(_LP64) 如何为真?

c++ - C/C++ 风格——修改函数参数

c# - 调试器暂停代码时如何忽略时间的流逝?

performance - WinDbg 加载符号需要很长时间;正在搜索大型网络 UNC 符号存储中的每个目录

python - LLDB:在 python 脚本执行完成后静默继续

c - 背包代码 - 在某些情况下不起作用