Czy istnieje sposób osadzenia instrukcji pragmy w makrze z innymi instrukcjami?
Próbuję osiągnąć coś takiego:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
Nie ma problemu z rozwiązaniami doładowania (z wyjątkiem fali), jeśli takie istnieją.
c-preprocessor
pragma
stringification
Anycorn
źródło
źródło
Odpowiedzi:
Jeśli używasz c99 lub c ++ 0x, istnieje operator pragma, używany jako
co jest równoważne z
z wyjątkiem tego, że może być używany w makrach (patrz sekcja 6.10.9 standardu c99 lub 16.9 ostatecznej wersji roboczej komisji c ++ 0x)
Na przykład,
po umieszczeniu w
gcc -E
dajeźródło
__pragma()
operatora preprocesora, który niestety różni się nieco od_Pragma()
operatora C99 (C99 przyjmuje literał ciągu, MSVC pobiera tokeny, które nie są w ciągu): msdn.microsoft.com/en-us/library/d9x1s805 .aspxJedną fajną rzeczą, którą możesz zrobić z _Pragma ("argument"), jest użycie go do rozwiązywania niektórych problemów z kompilatorem, takich jak
źródło
Nie, nie ma na to przenośnego sposobu. Z drugiej strony, w ogóle nie ma przenośnych sposobów używania #pragma. Z tego powodu wiele kompilatorów C / C ++ definiuje własne metody robienia rzeczy podobnych do pragmy i często można je osadzać w makrach, ale potrzebujesz innej definicji makra na każdym kompilatorze. Jeśli chcesz iść tą drogą, często kończysz na takich rzeczach:
W przypadku, gdy nie jest to oczywiste, chcesz zdefiniować
Weak_b
iWeak_e
jako konstrukcje nawiasów rozpoczynających i kończących, ponieważ niektóre kompilatory, takie jak GCC, dodają atrybuty jako uzupełnienie do podpisu typu, a niektóre, jak MSC, dodają go jako przedrostek (a przynajmniej tak kiedyś minęły lata, odkąd używałem MSC). Posiadanie konstrukcji w nawiasach pozwala zdefiniować coś, co zawsze działa, nawet jeśli musisz przekazać całą sygnaturę typu do konstrukcji kompilatora.Oczywiście, jeśli spróbujesz przenieść to do kompilatora bez wymaganych atrybutów, nie możesz nic zrobić, ale pozostawić makra rozwinięte do niczego i mieć nadzieję, że twój kod nadal działa. Jest to prawdopodobne w przypadku pragm czysto ostrzegawczych lub optymalizujących. W innych przypadkach nie tak bardzo.
Aha, i podejrzewam, że faktycznie musiałbyś zdefiniować Weak_b i Weak_e jako makra, które przyjmują parametry, ale nie chciałem czytać dokumentacji, aby dowiedzieć się, jak utworzyć słabą definicję tylko dla tego przykładu. Zostawiam to jako ćwiczenie dla czytelnika.
źródło
Nie, nie można umieścić instrukcji preprocesora w instrukcjach preprocesora. Mógłbyś jednak umieścić go w
inline
funkcji. To jednak pokonujeC
metkę.źródło
inline
, a większość głównych implementacji C89 ma pewne odmiany.inline
kolejna rzecz, którą C pożyczył z C ++!:)