【发布时间】:2019-04-23 06:08:41
【问题描述】:
#include <stdio.h>
void print(int a = __LINE__){printf("hello %d\n", a);}
void main(){
print();
print();
print();
print();
}
本例中的 __LINE__ 宏扩展为 3,因此 print 函数以相同的值被调用了 4 次。有没有办法说服编译器在调用点扩展此宏,以便使用 C++11 中存在的功能使用 6,7,8,9 而不是 3,3,3,3 调用打印函数?
我的用例:
在我的应用程序中,我提供了多个采用唯一 ID 的函数。每个调用点/位置的 ID 应该是唯一的(因此,如果通过同一语句调用该函数两次,它应该接收相同的 ID)。目前,用户必须在调用点手动输入LOCATION 宏,如下所示:
#define S1(x) #x //voodoo to concat __FILE__ and __LINE__
#define S2(x) S1(x)
#define LOCATION __FILE__ S2(__LINE__)
do_stuff1(arguments, LOCATION)
do_stuff2(arguments, LOCATION)
如果我可以保存他们的输入,而不为每个函数创建一个宏,这样会更方便:
#define do_stuff1(do_stuff1_imp(arguments, LOCATION))
#define do_stuff2(do_stuff2_imp(arguments, LOCATION))
因此,我认为默认参数可以解决问题。有什么方法可以实现吗?
【问题讨论】:
-
在宏中完成工作,
#define print() {printf("hello %d\n", __LINE__);}。 -
这正是我在最后一个代码块中写的,只是在
do_stuff而不是print上翻译。我知道这个解决方案,并想知道是否有一种不那么乏味的方法来做到这一点(我有很多这样的功能。我需要为每个功能制作一个宏)。 -
等等,不,对不起,我错了。你的方式使整个函数成为一个宏。那确实不一样。我会考虑的,谢谢!
-
@MatthieuBrucher 不要像那样将标签从 C++ 更改为 C。即使问题中的所有代码都可以使用 C 编译器进行编译,但这并不会使问题成为 C 问题(请注意,默认参数是 C++ 功能)。 OP 正在使用 C++ 编译器,并且正在寻找 C++ 答案,而不是 C。
标签: c++ c++11 macros default-arguments std-source-location