目的是为C语言创建一个预处理器,以您喜欢的语言在源代码大小(以字节为单位)方面尽可能地小。它的输入将是C源文件,其输出将是经过预处理的源代码。
它需要处理的项目为:注释删除(行/块),#include指令(通过在相对路径中打开文件并在需要的位置替换文本),#define,#undef,#if, #elif,#else,#endif,#ifdef,#ifndef和define()。其他C预处理程序指令,例如#pragmas或#errors,可以忽略。
无需在#if指令中计算算术表达式或比较运算符,我们假设该表达式只要包含非零的整数(它的主要用途将用于define()指令),就将计算为true。可能的输入和输出示例如下(为了更好的显示,输出文件中可能的多余空格被剪裁了,不需要您的代码这样做)。能够正确处理以下示例的程序将被认为是足够的。
----Input file: foo.c (main file being preprocessed)
#include "bar.h" // Line may or may not exist
#ifdef NEEDS_BAZZER
#include "baz.h"
#endif // NEEDS_BAZZER
#ifdef _BAZ_H_
int main(int argc, char ** argv)
{
/* Main function.
In case that bar.h defined NEEDS_BAZ as true,
we call baz.h's macro BAZZER with the length of the
program's argument list. */
return BAZZER(argc);
}
#elif defined(_BAR_H_)
// In case that bar.h was included but didn't define NEEDS_BAZ.
#undef _BAR_H_
#define NEEDS_BARRER
#include "bar.h"
int main(int argc, char ** argv)
{
return BARRER(argc);
}
#else
// In case that bar.h wasn't included at all.
int main()
{return 0;}
#endif // _BAZ_H_
----Input file bar.h (Included header)
#ifndef _BAR_H_
#define _BAR_H_
#ifdef NEEDS_BARRER
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
#define BARRER(i) (bar(&i), i*=2, bar(&i))
#else
#define NEEDS_BAZZER // Line may or may not exist
#endif // NEEDS_BARRER
#endif // _BAR_H_
----Input file baz.h (Included header)
#ifndef _BAZ_H_
#define _BAZ_H_
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
#define BAZZER(i) (baz(&i), i+=2, baz(&i))
#endif // _BAZ_H_
----Output file foopp.c (no edits)
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
int main(int argc, char ** argv)
{
return (baz(&argc), argc+=2, baz(&argc));
}
----Output file foopp2.c (with foo.c's first line removed)
int main()
{return 0;}
----Output file foopp3.c (with bar.h's line "#define NEEDS_BAZZER" removed)
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
int main(int argc, char ** argv)
{
return (bar(&argc), argc*=2, bar(&argc));
}
您可以提供输入/输出样本吗?
—
Florent 2014年
向我们提供测试代码。没有例子几乎是不可能的。
—
Ismael Miguel
嗯,我会的。请耐心等待,因为时间和工作量限制,我不能很快。
—
Thanasis Papoutsidakis 2014年
怎样的多少
—
Hasturkun 2014年
#if
需要得到支持?即预处理器是否需要使用算术,按位运算等来支持表达式?
好的,示例输入/输出和更多说明已添加
—
Thanasis Papoutsidakis