2016-07-25 3 views
-3

Я хотел иметь макрос (или что-нибудь еще, что работает), который может проходить через файл C/C++, и подсчитывать количество вхождений определенной строки (в физическом C/C++).Препроцессор для подсчета количества строк в файле

#define numInFile(str) [???] 

int main() { 
    printf("blahblah"); 
    printf("You've used printf %d times", numinFile ("printf") - 2); //-2 account for this call 
    return 0; 
} 

Edit: Вопрос был изначально специфичны для использования этой функции для выхода вызовов. Теперь он обобщается для любого использования.

+2

Это не C, ни C++. – Quentin

+0

Если вы открыты для использования оболочки, вы можете использовать «grep» quit (300 "* .c | wc'. Первое возвращаемое число будет равно количеству совпадений. Используйте' egrep', если вам нужны регулярные выражения. –

+0

I can not use grep. Я хочу директиву препроцессора, подсчитывать и использовать этот номер в файле c/C++. Это не дубликат, потому что этот вопрос только печатает его, не использует его. –

ответ

0

Для этого нет ничего встроенного. Можно было бы подключить что-то до вашей системы сборки, чтобы сгенерировать файл заголовка с соответствующими подсчетами и использовать макрос, чтобы вытащить правильное значение из этого файла заголовка.

Однако, исходя из того, что различные системы unix устанавливают ограничения на диапазон значений выхода (в Linux-машине, на которую я смотрю, будут использоваться только самые младшие 8 бит, что означает, что exit(256) будет идентичным exit(0)), вы, вероятно, на самом деле не хотите этого делать в первую очередь, вам лучше использовать макрос регистрации, который испускает имя компиляции, линию, в которой он был расширен, а затем использует exit(EXIT_FAILURE).

2

Если я правильно вас понимаю, вы хотите иметь уникальные коды ошибок, чтобы вы могли вернуться к строке, где произошла ошибка?

обращусь, что Y question instead of your X one:

Вы можете использовать __LINE__. __LINE__ расширяется до целочисленной константы текущего номера строки. Вы можете #define бросить как:

#define quit(code) (quit)(__LINE__+(code)) 
void (quit)(code) { // seperate func in case you want to do more 
    exit(code); 
} 

Имейте в виду, однако, что код выхода процесса не лучший способ кодирования такой информации. В POSIX гарантированно доступен только младший 8 бит кода выхода. Но поскольку вы уже используете 300 в качестве базового значения, я предполагаю, что вы находитесь в Windows или какой-либо другой системе, где это не вызывает беспокойства.

Для целей отладки в качестве альтернативы рассмотрите возможность записи в stderr, когда произошла ошибка (возможно, с флагом командной строки).

Если exit был просто пример, и вы собираетесь использовать его в своем приложении, вы можете сохранить __LINE__ и __FILE__ в глобальных (или _Thread_local) переменных на ошибки и хранить только причину выхода в коде ошибки.


Что касается вашего вопроса X, препроцессор не делает таких вещей. Вам придется разгружать такие задачи в оболочку/perl/любой скрипт, который может вызвать скрипт сборки.

+1

(Выход был всего лишь примером) Связано с xy: Спасибо за ссылку, у меня возник вопрос (uniqe codes), который пришел с ответом (подсчет), и поэтому я попросил вторую (более новую) вместо фактической! –

+0

Я бы попытался быть портативным и использовать только EXIT_FAILURE и EXIT_SUCCESS, либо должен быть выражен исключением или выходом stderr. – Superlokkus

Смежные вопросы