我们要在其中打印一个文件和一行(__file__
,__line__
),我们要打印其内容。这样的事情可以通过预处理器吗?
答案 0 :(得分:2)
也许是这样的?
#include <stdio.h>
#define DBG(X) printf(__FILE__":%d DBG("#X")\n", __LINE__)
int main ()
{
DBG(this is a test);
}
这会产生输出:
test.cc:7 DBG(this is a test)
编辑您必须访问源文件或存储源文件。存储文件后,打印正确的行很简单。一种方式:
#define PROGRAM_PRINT_INIT(X) \
static ProgramPrint pp = ProgramPrint(X)
#define DBG(X) std::cerr << "[" << pp.name << ":" << X << "]" \
<< pp.file[X] << std::endl
struct ProgramPrint {
std::string name;
std::vector<std::string> file;
ProgramPrint (const char *filename) : name(filename) {
std::ifstream in(filename);
std::string line;
while (getline(in, line)) file.push_back(line);
}
};
请注意,vector
索引从零开始,因此请相应地使用DBG()
。
答案 1 :(得分:0)
是的,C / C ++不是为此而制作的。但如果你真的想看看你能弯曲多远,这是一个建议。
假设你想编译test.cpp来测试。在编译之前,我们需要在源代码文件中添加cstring数组的源代码行。我们将在一个单独的文件test_temp.cpp中执行此操作,我们将调用数组TEST_CODE。
将以下内容放在一个文件中:code.awk(这样可以更容易重复使用)。
BEGIN {
for (i = 0; i < 128; i++) {
table = sprintf("%s%c", table, i);
}
print("= {\"\"")
}
{
printf(",\"")
for(j=1; j<=length($1); j++) {
c = substr($1,j,1)
printf("\\x%x", index(table, c) - 1)
}
printf("\"\n")
}
END {
printf("};\n")
}
通过引用ASCII字符的“表格”,它使用每个字符的(十六进制)ASCII值(例如,'\ x41'代表'A'),如果有像标签等的东西,可能在你的源代码,但应该在C / C ++字符串文字中进行转义。
要在命令行(或在makefile中)进行编译,请键入
echo "char* TEST_CODE[]" > test_temp.cpp
awk -f code.awk test.cpp >> test_temp.cpp
cat test.cpp >> test_temp.cpp
g++ -o test test_temp.cpp
rm test_temp.cpp
如果您想获得源代码文件的第80行(从1开始),您可以编写
TEST_CODE[80]
注意这是在预处理器命令之前发生的。 这可以通过多个文件和头文件完成,在每种情况下都可以通过TEST_CODE更改数组名称。
这确实有漏洞,但它会在常见情况下起作用。
注意:由于char * / string文字转换,可能是来自g ++的A LOT编译器警告,但您可以使用-w标志关闭它们。