2014-11-25 5 views
2

У меня есть следующая проблема. Я пишу C код, который зависит от чужого кода, от которого я не могу вносить изменения. И в этом коде (что мне не разрешено изменять) есть define директива препроцессора. Мой код компилируется перед этим другим фрагментом кода. И мне нужен способ обойти это, так что мой код не зависит от этого . Определите директиву.Как игнорировать директиву define?

Есть ли способ как-то сказать препроцессору игнорировать все директивы отныне?

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

#pragma GCC poison define 

Я знаю, что ответить на этот вопрос непросто, но я по-настоящему ценю некоторую помощь.

+1

Не можете ли вы использовать '# ifdef' вместе с' # undef'? – syntagma

+0

Это невозможно, потому что мои предпроцессорные директивы запускаются перед другими директивами, поэтому в то время ничего не определено ... – Void

+0

@REACHUS Его код скомпилирован перед другим кодом. Во всяком случае, препроцессор не думает об этом. Разве вы не можете просто сказать: «эй, не делай этого?» – edmz

ответ

0

Я думаю, что вы можете сделать что-то вроде этого: Предположим, что проблема в том, что другой код определяет string как char * и где-то в заголовках, которые вам нужно включить. Вы можете определить в ваших c файлов после того, включает в себя от другого кода просто:

#ifdef string 
    #undef string 
#endif 

Если ваш код включать каждый раз одни и те же заголовки, вы можете поместить все включает в себя в одном из заголовка и дезинфицировать его в конце: Пример может служить other_include.h:

#ifndef _OTHER_INCLUDE_H 
#include <otherheader_a.h> 
#include <otherheader_b.h> 
#include <otherheader_c.h> 

/*Sanitize string definition */ 

#ifdef string 
    #undef string 
#endif 
#endif /* _OTHER_INCLUDE_H */ 

Если вы не так повезло, что вы должны создать sanitize.h заголовок и включить его после того, как все другие включают в ваших c файлов.

Кроме того Если вам нужна какая-то часть коды, где отключить макрос и восстановить его после того, как:

#ifdef string 
    #define _temp_string string 
    #undef string 
#endif 

и когда вы хотите восстановить его

#ifdef _temp_string 
    #define string _temp_string 
    #undef _temp_string 
#endif 

Это не очень элегантно, но вы можете использовать его как мелкое зерно, чтобы сделать вашу подпрограмму безопасной.

+0

Проблема в том, что у меня нет доступа к части кода, где определена #define строка char * - она ​​находится в другом коде – Void

+0

@ user3748798 Я не понимаю: вы хотите использовать или нет эту директиву в своем коде ? –

+0

Нет, я не хочу, чтобы директива define влияла на мой код. – Void

0

Вы написали, что директивы препроцессора выполняются перед другими директивами, поэтому в то время ничего не определено.

В этом случае я думаю, что единственным решением было бы предварительно обработать файл до этапа препроцессора с использованием собственного скрипта и изменить определенные значения на то, что соответствовало бы вашим потребностям и не повлияло бы на ваш код. Я не думаю, что есть лучшее решение.

+0

директива, что я пытаюсь избежать следующим образом: #define строки символ * , и я хочу, чтобы иметь возможность использовать string обычно – Void

+0

@ user3748798 Вы имеете в виду как имя переменной или как 'std :: string' C++? – syntagma

+0

Да, это так. – Void

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