Я беру то, что ранее сказал назад.Я думаю, что у меня может быть способ заставить эту работу работать на чистом с / с ++, хотя и очень грязно.Вам нужно будет передать указатель в ваши функции ...
т.е. bool hello_world (std :: string & my_string, const std :: string * const my_string_ptr) {
bool hello_world (std:: string my_string, const std :: string * const my_string_ptr) {
, если вы сейчас протестировали
if (& my_string == my_string_ptr)
Это оценило бы true , если переменная была передана по ссылке, и false, если передано значение .
Конечно, дублирование ваших переменных во всех ваших функциях, вероятно, не стоит ...
Йоханнес прав ... не в чистом с ++.Но вы МОЖЕТЕ сделать это.Хитрость в том, чтобы обмануть.Используйте встроенный язык сценариев, такой как perl, для поиска в вашем источнике.Вот встроенный модуль Perl:
http://perldoc.perl.org/perlembed.html
Передайте ему имя функции, имя переменной и местоположение источника, а затем используйте регулярное выражение, чтобы найти переменную и проверить ее тип.На самом деле это может быть лучшим решением для вашего кода в целом, при условии, что у вас всегда будет под рукой исходник.
Я опубликую функцию для этого базового подхода немного ... должен позаботиться о некоторой утренней работе!:)
Даже если вы не хотите распространять исходный код, вы можете создать какой-нибудь файл упакованных данных функций / переменных, который можно было бы проанализировать через @ runtime и получить эквивалентный результат.*
Редактировать 1
Например ... используя функцию # I32 match(SV *string, char *pattern)
в руководстве по Perl Embed, вы можете сделать что-то вроде:
bool is_reference(const char * source_loc, const char * function_name,
const char * variable_name) {
std::ifstream my_reader;
char my_string[256];
SV * perl_line_contents;
bool ret_val = false;
char my_pattern [400]=strcat("m/.*",function_name);
my_pattern=strcat(my_pattern, ".*[,\s\t]*");
my_pattern=strcat(my_pattern, variable_name);
my_pattern=strcat(my_pattern, "[\s\t]*[\(,].*$");
my_reader.open(source_loc.c_str());
while (!my_reader.eof()) {
my_reader.getline(my_string,256);
sv_setpv(perl_line_contents,my_string);
if(match(perl_line_contents,my_pattern)) {
ret_val= true;
}
}
return ret_val;
}
... есть ... два способа сделать это (см. Обновление выше).