我想要一个可以通过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;
}
编辑问题最初专门针对退出调用使用此功能。它现在可用于任何用途。
答案 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 }}