4

У меня есть код устаревшего кода, который имеет условную предварительную обработку, например. #ifdef и #else, где я нашел использование макроса __attribute__. Я сделал быстрое исследование и выяснил, что он специфичен для компиляторов GNU. Я должен использовать этот устаревший код в Visual Studio 2010 с использованием компилятора MSVC10 и, видимо, он жалуется повсюду, он видит атрибут ((не используется)), хотя он защищен #ifndef и #ifdef s. Примером может служить:__attribute __() макрос и его влияние на проекты на Visual Studio 2010

#ifdef __tone_z__ 
    static const char *mcr_inf 
#else 
    static char *mcr_inf 
#endif 
#ifndef _WINDOWS 
__attribute__((unused)) % this is causing all the problem!! 
#endif 
= "@(#) bla bla copyright bla"; 



#ifdef __tone_z__ 
    static const char *mcr_info_2a353_id[2] 
#else 
    static  char *mcr_info_2a353_id[2] 
#endif 
__attribute__((unused)) = { "my long copyright info!" } ; 

Я действительно изо всех сил, чтобы понять, если это очень плохо спланирована код или это просто мое недоразумение. Как избежать обычных ошибок компилятора и компоновщика с этой директивой __attribute__()? Я начал получать ошибки C2061 (отсутствующие идентификаторы/неизвестные). У меня есть все необходимые файлы заголовков, и ничего не пропало, может быть, кроме компилятора GNU (чего я не хочу !!).

Кроме того, кажется, что символ конца строки ; также перепутался, когда я беру код в windows .... argh .... Я имею в виду UNIX end-of-line и Windows EOL, как можно Я использую этот код без изменения тела .... Я могу определить в моей странице свойств о _WINDOWS thingy, но не может автоматически настроить распознавание символов EOL.

Любая помощь приветствуется! Спасибо.

+1

Заметим, что '__attribute__' не макро. Просто убедитесь, что вы '#define _WINDOWS 1' при компиляции на окнах. –

+0

@MarcGlisse спасибо ... это то, на что я надеялся. Я использовал Visual Studio 2010, где, если вы нажмете CTRL + , вы увидите все предопределенные атрибуты функции и разрешенные макросы - _WINDOWS не существует. Я сделаю это либо в листе свойств, либо в моем основном файле runner. – ha9u63ar

+0

Вы, вероятно, хотели '#ifndef _MSC_VER' вместо' #ifndef _WINDOWS'. Существует определение с именем '_WINDOWS_' (но обратите внимание на дополнительное конечное подчеркивание), когда вы включаете' ', но обычно способ отличить GCC/MSVC определяется с помощью' GCC' и '_MSC_VER'. – Groo

ответ

14

Моя лучшая догадка, что _WINDOWS, на самом деле, не определяется компилятором, и поэтому использование __attibute__ является не защищены.

На мой взгляд, лучший способ защиты от атрибутов, чтобы определить макрос, как это:

#define __attribute__(A) /* do nothing */ 

Это нужно просто удалить все экземпляры __attribute__ из кода.

В самом деле, большая часть кода, который был написан, чтобы быть портативным имеет это:

#ifdef _GNUC 
    #define ATTR_UNUSED __attribute__((unused)) 
#else 
    #define ATTR_UNUSED 
#endif 

static TONE_Z_CONST char *integ_func ATTR_UNUSED = "my copyright info"; 

(Другие __tone_z__ условную удалены только для ясности.)

+0

Это не сработало! Я сделал достаточные исследования Google, и ничто, кажется, не решает эту проблему. Все, что мне нужно, - использовать устаревший код, написанный для компилятора GNU C, и поместить его в Visual Studio 2010. Я также обновил фрагмент кода! – ha9u63ar

+2

Компилятор MicroSoft просто не принимает никаких ключевых слов '__attribute__' или любого другого расширения GNU; даже некоторые стандартные C/C++ сомнительны. Вам придется удалить все эти вещи вручную или через препроцессор. Я показал вам несколько способов. Это действительно не так сложно. – ams