如何使用预处理器从源文件中获取一行文本
How to get line of text from source file using Preprocessor?
我们有一个文件和一行(__file__
,__line__
),我们想打印它的内容。通过预处理器,这样的事情可能吗?
也许是这样的?
#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()
。
是的,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标志关闭这些警告。
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何使代码打印文本文件中的第一行?
- 如何在C++中以这种方式返回一行文本?
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 需要从存档中读取一行文本.txt直到找到"hhh",然后转到下一行
- 如何在c ++中以一行(水平)打印两个文件的数据?如给定的.这两种形式来自两个不同的文本文件
- 到达分隔符时跳到文本文件的下一行
- 从文本文件中读取一行并将其存储在 C++ 中的 2D 矢量中
- 从文本文件中随机选取一行
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- 为什么这一行不输出我的文本文件?
- 代码无尽写入文本文件的第一行
- 如何从文本文件中读取一行并将其分为不同的变量
- C 在同一行中左右显示文本
- 以 LPCTSTR 开头编写另一行文本的最佳方法是什么?
- 阅读同一行上用双引号括起来的文本,并拒绝在不同行上关闭的双引号
- C :使用getline从文本文件中输入,要么跳过第一行,要么将其余部分弄乱
- C++ ->尝试逐字阅读一行文本。如何使指针等效于用于存储输入的当前二维数组
- 如何解决此问题,我需要从文本文件中导出一行