Поиск места декларации макроса (C++)

Модератор: Модераторы разделов

Аватара пользователя
whirlwind
Сообщения: 67

Поиск места декларации макроса

Сообщение whirlwind »

Извините, если вопрос покажется глупым

Есть довольно большой проект, много исходников. В одном из них есть такой текст:

Код: Выделить всё

#ifdef A_VIRER
чего-то обьявляется
#endif

проблема в том, что на одной машине, он все компилируется, а на другой -- нет. И дело, видимо, именно в том, что на одной машине этот самый A_VIRER определен, а на другой нет.

Собственно вопрос: можно ли как-то определить, где именно, в каком исходнике, был обьявлен макрос?
Пробовал grep'ом перекопать все исходники проекта, и места, где обычно заголовочные файлы хранятся, не нашел ничего. Строку вызова компилятора тоже проверил.
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Поиск места декларации макроса

Сообщение Folderx »

Код: Выделить всё

# FindWord:  search string in files;
#            FindWord string [ files ] [ dir ];
FindWord() {
    local TRUE=0 FALSE=0;
    local WORD="$1" FILES="${2:-*}" DIRECTORY="${3:-.}";
    local DEPTH="";

    if [ -z "$1" -o ! -z "$4" ]; then
        echo "Usage: $FUNCNAME string [ files ] [ dir ]" 1>&2;
        return $FALSE;
    fi;
    if [ ! -z "$3" ]; then
        DEPTH="-maxdepth 1";
    fi;
    if ! find "$DIRECTORY" $DEPTH -name "$FILES" \
            -exec grep -H "$WORD" {} ";" 2>/dev/null; then
        return $FALSE;
    fi;
    return $TRUE;
}


Код: Выделить всё

[guest@station ~]$ FindWord
Usage: FindWord string [ files ] [ dir ]
[guest@station ~]$ FindWord "typedef size_t" "" /usr/include
/usr/include/libmng_types.h:typedef size_t           mng_size_t;             /* size field for memory allocation */
/usr/include/pngconf.h:   typedef size_t png_size_t;
/usr/include/db_cxx.h:  typedef size_t (*bt_prefix_fcn_type)        /*C++ version available*/
[guest@station ~]$
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Поиск места декларации макроса

Сообщение Subj »

grep -iR 'A_VIRER' ./*
Building better software with Ada
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Поиск места декларации макроса

Сообщение Portnov »

Я обычно использую grep -nrs SOMETHING /dir/ :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Поиск места декларации макроса

Сообщение Folderx »

Код: Выделить всё

FindWord "$SOMETHING" "" dir == grep "$SOMETHING" dir/*
FindWord "$SOMETHING" == grep -r "$SOMETHING" .
FindWord "$SOMETHING" "*.h" dir == grep "$SOMETHING" dir/*.h
FindWord "$SOMETHING" "*.h" == ?

спускается по каталогам, производя поиск только в .h файлах
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Поиск места декларации макроса

Сообщение Luinnar »

Folderx писал(а):
28.02.2009 01:19

Код: Выделить всё

FindWord "$SOMETHING" "" dir == grep "$SOMETHING" dir/*
FindWord "$SOMETHING" == grep -r "$SOMETHING" .
FindWord "$SOMETHING" "*.h" dir == grep "$SOMETHING" dir/*.h
FindWord "$SOMETHING" "*.h" == ?

спускается по каталогам, производя поиск только в .h файлах

Аналогичный результат будет при выполнении:

Код: Выделить всё

find DIR -type f -name "*.h" -exec grep SOMETHING {} '+'
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Поиск места декларации макроса

Сообщение Folderx »

это уже find пошла, FindWord на ней и так построена, а надо без find
Спасибо сказали:
Аватара пользователя
Cra3y
Сообщения: 80
ОС: Debian

Re: Поиск места декларации макроса

Сообщение Cra3y »

Код: Выделить всё

#!/usr/bin/perl
#
# srch.pl поиск файла, в котором определяется макрос
#
use strict;
use warnings;


# список папок в которых искать инклуды
our @includes = (
    '.',
    '/usr/include',
    '/usr/local/include'
);

sub findMacros {
    my $what = shift;
    my $file = shift;
    my $F;
    open($F, $file) || return;
    my $line = '';
    my $cnt = 0;
    while($line = <$F>) { # читаем файл построчно и ищем имена
        # включаеммых файлов и дефайны
        $cnt++; # счетчик строк
        if ( ( $line =~/^[\s]*#[\s]*include[\s]+<([A-Za-z0-9\.]+)>/ ) ||
             ( $line =~/^[\s]*#[\s]*include[\s]+"([A-Za-z0-9\.]+)"/ ) ) {
            my $inc = $1; # содержит имя включаемого файла
            #print "$inc\n";
            my $dir = '';
            foreach $dir(@includes) {
                findMacros( $what, "$dir/$inc" ); # продолжаем поиск
                    # в этом файле
            }
        }
        elsif ( $line =~/^[\s]*#[\s]*define[\s]+(\w+).*/ ) {
            my $word = $1; # содержит имя макроса
            #print "$line";
            if ( $word eq $what ) { # НАШЛИ!!!!
                print "$what defined in $file on line $cnt\n";
                close($F);
                return;
            }
        }
    }
    close($F);
}

sub usage {
    print "srch.pl <what> <start.file>\n";
    print "example: srch.pl __USE_GNU main.cpp\n"
}

if (scalar(@ARGV) != 2) {
    usage();
}
else {
    findMacros( $ARGV[0], $ARGV[1] );
}
ищет в стартовом файле инклуды и дефайны продолжая поиск в найденных инклудах
выводит результат в формате
what file line
HP G62 (AMD Phenom II x3 1.8GHz 4GB DDR3 Ram) / Debian 8 amd64
Спасибо сказали: