Вам нужно расширить этот макрос в двух уровнях:
#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
Почему?
Короткий ответ: Вам нужно расширить __LINE__
в двух уровнях, прежде чем передать его в #x
.
Длинный ответ: Прежде всего, с помощью оператора #
в функции, как макроса, он должен сопровождаться макро параметром, но __LINE__
не является параметр, поэтому компилятор жалуется на это бродячий оператор.
Во-вторых, сама по себе __LINE__
макрос и содержит номер текущей строки, она должна быть расширена на номер, прежде чем использовать его с #
, в противном случае, вы получите строку "__LINE__"
вместо номера.
Macro S2(__LINE__)
расширяет __LINE__
до номера строки, затем мы передаем номер строки #x
.
Примечание. Вы можете упростить построение исключения до 'std :: exception (" ABCD. "LOCATION)'. –
вы можете посмотреть здесь http://stackoverflow.com/questions/1739102/concatenating-strings-in-macros-c –