C/C++中的#define用法

5
我需要在C/C++中编写这样的定义。
#define scanf( fscanf(inf,
为了将每个scanf(替换为fscanf(inf,字面意义上的。但我不知道怎么做......谢谢

8
拒绝使用宏的这种方式。 - Brian Neal
@Brian 这更多是出于好奇而非使用... - Betamoo
我同意,ctrl+h 有什么问题吗? - jcolebrand
@Mattew 这个在不同的编译器之间有区别吗?! - Betamoo
1
由于OP正在编写C ++,因此已删除C标签。 - Puppy
显示剩余4条评论
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11
你想使用可变参数宏Variadic macro。 在你的情况下,我认为你想要:
#define scanf(...) fscanf(inf,__VA_ARGS__)

2
请注意,这不是可移植的。 - Brian Neal
@Brian:它在C++0x草案中,并得到GNU、Intel和Microsoft的支持,因此至少在x86上,我认为它足够便携,适用于大多数目的。 - Christoph
1
它在C99官方标准中,因此是可移植的C。 - caf
这个问题最初只涉及C++,后来被编辑为涉及C/C++。对于我们这些使用比主流更多的编译器,并且希望我们的代码现在就具有可移植性的人来说,这不是一个选项。当然,如果你的目标编译器都支持它,那就继续使用吧。我仍然认为值得提到的是,它现在对于C++来说并不具备可移植性。但是,是的,它在C++0x草案标准中。 - Brian Neal
它是可变参数的,而不是 variadric :) - Jordan Lewis

4
我需要在C++中编写这样的定义。 不,你不需要。你真正想做的是重定向stdin。
freopen(inf, "r", stdin);

3
只需使用fscanf编写所有代码,并像这样使用宏定义文件名:
#ifdef USE_SCANF
#define SCANF_FILE(file) stdin
#else
#define SCANF_FILE(file) file
#endif

fscanf(SCANF_FILE(blah), "%d", &a);

1

当然,你尝试的方式是不可能的。

你必须像这样做:

#define scanf(S, ...) fscanf(inf, S, __VA_ARGS__)

例如请查看这里

编辑:GNU cpp也支持可变参宏;它是VA_ARGS前面加上双下划线,后面以双下划线结尾...我得在这里研究转义标记...


1
使用反引号将文本包围起来,可以创建内联代码。这是在段落中编写__VA_ARGS__的最佳方式。 ;) - Chris Lutz

0

你不能替换括号。如果你正在使用Visual C++,那么你可以使用可变参数宏来实现你想要的功能:

#define scanf( format, ... ) fscanf( inf, format, __VA_ARGS__ )

其他编译器可能有类似的功能,但我不熟悉它们。


这是标准的C99。§6.10.3.1 - Matthew Flaschen
让我感到惊讶。感谢您的澄清。 - Peter Ruderman
据我所知,C99是标准。 - ShinTakezou
这个问题是关于C ++的,而这不是标准。 - Brian Neal
@Brian:但它在C++0x草案中,只要你的编译器支持,使用它是合理的。 - Christoph
gcc和Microsoft的编译器都有这个扩展。快速阅读论坛,似乎英特尔编译器也支持它们。维基百科说Borland编译器也支持它们。因此,我想我们可以说所有主要的编译器都有一个支持可变宏的预处理器。 - ShinTakezou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,