如何区分宏函数和函数函数而没有任何歧义?

时间:2018-08-20 12:07:10

标签: c++

#include<iostream>
int func(int, int);
#define func(x,y) x/y+x
int main()
{
    int i, j;

    scanf("%d", &i);
    scanf("%d", &j);

    printf("%d ", func(i + j, 3));
    printf("%d\n", func(i + j, 3));

}

int func(int x, int y) {
    return y / x + y;
}

应该在此代码中添加什么,以便第一个输出是宏的结果,第二个输出是函数的结果?

3 个答案:

答案 0 :(得分:11)

几种方法:

printf("%d ", func(i + j, 3)); // Macro call
#undef func // Macro is no longer defined
printf("%d\n", func(i + j, 3)); // Function call

printf("%d ", func(i + j, 3)); // Macro call
printf("%d\n", (func)(i + j, 3)); // Function call

答案 1 :(得分:2)

另一种方式:

a <- data.frame(one=1:3, two=4:6, three=7:9)
write.csv(a, 'a.csv', row.names=F)
read.csv('a.csv')

  one two three
1   1   4     7
2   2   5     8
3   3   6     9

在Boost.PP中可以看到,#define EMPTY printf("%d\n", func EMPTY (i + j, 3)); 宏“消耗”了扩展迭代,并且生成的EMPTY保持不变。

答案 2 :(得分:0)

一种解决方案是

printf("%d\n", (&func)(i + j, 3));

(&func)使用函数func的地址。由于它的格式不为func(),因此没有宏替换。由于可以调用函数指针,因此行为符合预期。