2013-03-02 3 views
2

У меня есть программа, которую я запускаю на двух разных компиляторах, и каждый компилятор имеет другую библиотеку обработки файлов. Например, на библиотеке требуется:#Define Целый вызов функции с аргументами?

fwrite(buffer,size,elements,file) 

В то время как другой:

f_write(file,buffer,size,elements) 

есть в любом случае я мог бы использовать глобальную #define в моем главном файле заголовка внутри #ifdef заявления, что позволит мне легко переход между компиляторами?

+0

'f_write' lol где это тогда –

ответ

7

Sure:

#ifdef STUPID_COMPILER 
# define fwrite(ptr, size, nitems, stream) f_write(stream, ptr, size, nitems) 
#endif 

Тогда просто использовать fwrite() в коде - никакой функции-оболочки необходимо. Препроцессор переведет его на вызов f_write(), если вы используете компилятор/библиотеку, которая требует этого.

+0

Thx, отлично работает – PumpkinPie

+0

Возможно, «другой» компилятор не предоставляет стандартную реализацию, таким образом, разницу имен? Не обязательно глупо, но очевидно другое? Кстати, я думаю, что ответ, который вы предоставили, - это «правильный» способ сделать это. –

+0

@ Джош: Нет, довольно глупо. Вот почему. –

2

Вы могли бы сделать новую функцию:

size_t my_fwrite(...) 
{ 
#ifdef REAL_FWRITE 
    return fwrite(buffer,size,elements,file); 
#elif F_WRITE 
    return f_write(file,buffer,size,elements); 
#else 
    #error "No fwrite"  
#endif 
} 

Какой реализации не дает fwrite, но имеет f_write?

+0

Yup, это лучший подход, поскольку он инкапсулирует #define в одном месте. –

+0

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

+0

@JoshPetitt Ницца, узнал что-то :-) – cnicutar

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