用于计算文件中字符串数的预处理器

Preprocessor to count number of strings in file

本文关键字:预处理 处理器 字符串 计算 文件 用于      更新时间:2023-10-16

我想要一个宏(或任何其他有效的宏),它可以遍历C/C++文件,并计算特定字符串(在物理C/C++文件中)的出现次数。

#define numInFile(str) [???]
int main() {
    printf("blahblah");
    printf("You've used printf %d times", numinFile ("printf") - 2); //-2 account for this call
    return 0;
}

编辑:问题最初是针对使用此功能进行退出调用而提出的。它现在可以推广到任何用途。

如果我理解正确,您希望有唯一的错误代码,可以追溯到错误发生的行?

我将回答Y问题,而不是你的X问题:

您可以使用__LINE__。CCD_ 2扩展为当前行号的整数常数。您可以将#define退出为:

#define quit(code) (quit)(__LINE__+(code))
void (quit)(code) { // seperate func in case you want to do more
    exit(code);
}

但请记住,流程的退出代码并不是对此类信息进行编码的最佳方式。在POSIX上,只有出口代码的低8位才保证可用。但是,由于您已经使用300作为基本值,我假设您使用的是Windows或其他系统,而这不是一个问题。

出于调试目的,也可以考虑在发生错误时(可能带有命令行标志)写入stderr

如果exit只是一个示例,并且您打算在应用程序中使用它,则可以在出现错误时将__LINE____FILE__保存在全局(或_Thread_local)变量中,并在错误代码中仅存储退出原因。


关于你的X问题,预处理器不会做这样的事情。您将不得不将这些任务卸载到构建脚本可以调用的shell/perl/任何脚本中。

没有任何内置功能。可以将某些东西连接到构建系统,以生成具有相关计数的头文件,并使用宏从该头文件中提取正确的值。

然而,基于各种unix系统对退出值的范围进行限制的事实(我正在查看的linux机器将只使用最低的8位,这意味着exit(256)将与exit(0)相同),您可能根本不想这样做,最好使用一个发出编译单元名称的日志宏,它被展开的行,然后使用CCD_ 11。