Существует макрос препроцессора __LINE__
, который дает вам целое число для строки, в которой отображается строка. Вы можете взять его значение в какой-то строке, а затем в более поздней строке и сравнить.
static const int BEFORE = __LINE__;
foo();
bar();
baz();
quux();
static const int AFTER = __LINE__;
static const int COUNT = AFTER - BEFORE - 1; // 4
Если вы хотите посчитать вхождения чего-то, а не строки источника, __COUNTER__
может быть нестандартным опция, поддерживаемая некоторыми компиляторами, такими как G CC и MSV C.
#define MAGIC2_2(c)
#define MAGIC2(c) MAGIC2_2(c)
static const int BEFORE = __COUNTER__;
void foo(); MAGIC2(__COUNTER__);
void bar(
int multiple,
float lines); MAGIC2(__COUNTER__);
void baz(); MAGIC2(__COUNTER__);
void quux(); MAGIC2(__COUNTER__);
static const int AFTER = __COUNTER__;
static const int COUNT = AFTER - BEFORE - 1; // 4
Я принял начальное значение __COUNTER__
, поскольку оно могло использоваться ранее в исходный файл или некоторый включенный заголовок.
В C вместо C ++ существуют ограничения на постоянные переменные, поэтому вместо него можно использовать enum
.
enum MyEnum
{
FOO = COUNT // C: error: enumerator value for ‘FOO’ is not an integer constant
};
Замена const с enum
:
enum {BEFORE = __LINE__};
foo();
bar();
baz();
quux();
enum { COUNT = __LINE__ - BEFORE - 1};
enum MyEnum
{
FOO = COUNT // OK
};