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

时间:2016-07-25 15:05:10

标签: c++ c

我想要一个可以通过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;
}

编辑问题最初专门针对退出调用使用此功能。它现在可用于任何用途。

2 个答案:

答案 0 :(得分:2)

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

我将解决Y question instead of your X one

您可以使用__LINE____LINE__扩展为当前行号的整数常量。您可以#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 /脚本中。

答案 1 :(得分:0)

没有任何内置功能可以做到这一点。可以将某些内容挂钩到构建系统以生成包含相关计数的头文件,并使用宏从该头文件中提取正确的值。

然而,基于各种unix系统对退出值范围的限制这一事实(我所看到的linux机器只会使用最低的8位,这意味着exit(256)将与{exit(0)相同1}})你可能实际上不想在第一时间这样做,你最好使用一个日志宏,它发出编译单元的名称,扩展它的行,然后使用{{1 }}