C++ 与宏同名的函数 #包括 空f(整数a) { printf(“%d”,a); } #定义f(a){} int main() { /*调用f:函数*/ }

C++ 与宏同名的函数 #包括 空f(整数a) { printf(“%d”,a); } #定义f(a){} int main() { /*调用f:函数*/ },c++,c,puzzle,C++,C,Puzzle,如何调用f(函数)?写f(3)不起作用,因为它被{}代替了(f)(3)工作 C预处理器不会在()内部展开宏f 一个解决方案由@Prasoon发布,另一个解决方案可能只是为函数引入了另一个名称,如果您不能更改函数名称,宏名称也不能更改: #include<stdio.h> void f(int a) { printf("%d", a); } #define f(a) {} int main() { /* call f : function */ } #包括 空f(整数a) { p

如何调用
f
(函数)?写
f(3)
不起作用,因为它被
{}

代替了
(f)(3)工作


C预处理器不会在
()
内部展开宏
f



一个解决方案由@Prasoon发布,另一个解决方案可能只是为函数引入了另一个名称,如果您不能更改函数名称,宏名称也不能更改:

#include<stdio.h>
void f(int a)
{
printf("%d", a);
}
#define f(a) {}

int main()
{
 /* call f : function */
}
#包括
空f(整数a)
{
printf(“%d”,a);
}
#定义乐趣(f)//大括号是必需的
#定义f(a){}
int main()
{
乐趣(100);;
}

在线演示:

使用函数指针实现:

int main()
{
#undef f  // clear f!
 f(3);
}

不傻。假设有一个宏在其头文件中实现了对
f
的内联替换,并且希望使用该宏在实现文件中定义外部实现。这是一个标准的做法。这是一个愚蠢的面试问题。我不想为一家需要这个的公司工作。我不同意这是愚蠢的。这是任何打算使用预处理器的C程序员都应该知道的一种技术。@Prasoon:把这个问题称为“愚蠢”是自大的。仅仅因为你知道答案,并不意味着它“愚蠢”。因为宏f的形式必须是f(某种东西),C预处理器才能进行替换。@Nawaz和@R:我的错误。编辑了这篇文章。“C预处理器没有在()内展开宏f。”#定义foo3printf(“%d\n”,(FOO));工作.()
如何调用f
(我们不是在这里调用
fun
吗?因为如果调用
fun
可以,那么我们可以将函数的名称
f()
更改为
fun()
:)@iammilind:fun不是函数,预处理器将其替换为
f
(实际函数)。@Nyan,你对此投了反对票:)。提问者并没有提到这种情况。如果宏是在一个公共头文件中定义的,并且在其他几个文件中使用,则以这种情况为例。对于你不想使用的文件,你只需
#undef
it.+1就可以写出一个可能会让面试官恼火的正确答案!这是如此具有破坏性,以至于OP显然希望保留宏,除非另有说明,而不是相反。否则,在他的测试用例中,为什么要从定义的宏开始呢?
int main()
{
#undef f  // clear f!
 f(3);
}
int main() {
    void (*p)(int a);
    p = f;
    p(3); //--> will call f(3)
    return 0;
}