宏变量的重用
Reuse of macro variables
我正在尝试对大量函数进行基准测试,并且我已经定义了宏来概括时间戳。我做了一个头文件benchmarking.h如下:
#include <chrono>
#include <iostream>
#define START(x) xstart = std::chrono::steady_clock::now()
#define END(x) xend = std::chrono::steady_clock::now()
#define TIME(x) xtime = std::chrono::duration_cast<std::chrono::nanoseconds>(xend-xstart).count()
#define PRINT(x) std::cout << #x << "(), " << xtime << std::endl
对于所有的宏,x 被替换为函数名,没有参数括号。例如 PRINT(foobar);
等
但是,我对多个函数名称使用了相同的宏,因为我认为我可以多次替换 x。
即
START(foobar);
// later...
START(func);
但是,我得到一个错误:
xstart’ has a previous declaration as ‘std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration\<long int, std::ratio<1l, 1000000000l> > > xstart
一旦我用它来定义一个函数,我似乎就不能重用这个变量了。
但是,我从未在 PRINT 中遇到此错误。那么,是不是因为我在声明变量?
我基本上是想想出一种快速的时间戳函数方法,所以欢迎任何其他关于如何快速实现这一点的建议。
您需要使用宏令牌连接运算符##
:
#define START(x) x ## start = std::chrono::steady_clock::now()
其他宏也是如此。
当你只写xstart
时,x
没有被宏参数替换,但xstart
保持原样。参数替换仅对单个标识符起作用;它们不能是更大单词的一部分。
我正在尝试对大量函数进行基准测试,并且我已经定义了宏来概括时间戳。我做了一个头文件benchmarking.h如下:
#include <chrono>
#include <iostream>
#define START(x) xstart = std::chrono::steady_clock::now()
#define END(x) xend = std::chrono::steady_clock::now()
#define TIME(x) xtime = std::chrono::duration_cast<std::chrono::nanoseconds>(xend-xstart).count()
#define PRINT(x) std::cout << #x << "(), " << xtime << std::endl
对于所有的宏,x 被替换为函数名,没有参数括号。例如 PRINT(foobar);
等
但是,我对多个函数名称使用了相同的宏,因为我认为我可以多次替换 x。
即
START(foobar);
// later...
START(func);
但是,我得到一个错误:
xstart’ has a previous declaration as ‘std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration\<long int, std::ratio<1l, 1000000000l> > > xstart
一旦我用它来定义一个函数,我似乎就不能重用这个变量了。 但是,我从未在 PRINT 中遇到此错误。那么,是不是因为我在声明变量?
我基本上是想想出一种快速的时间戳函数方法,所以欢迎任何其他关于如何快速实现这一点的建议。
您需要使用宏令牌连接运算符##
:
#define START(x) x ## start = std::chrono::steady_clock::now()
其他宏也是如此。
当你只写xstart
时,x
没有被宏参数替换,但xstart
保持原样。参数替换仅对单个标识符起作用;它们不能是更大单词的一部分。