2011-09-22 32 views
12

Bazı gcc bayraklarının geçmesi gereken eski bir kodum var. Bu bayraklar için işlemci öncesi çekler ekleyebilir miyim?başarısız olur.

#ifndef _FNO_STRICT_ALIASING 
    #error -fno-strict-aliasing is required! 
#endif 
+0

, yapabilmesi gereken bir şey gibi geliyor. –

+0

@Code Monkey: Tabi ki bayrak, make aracılığıyla aktarılabilir. Ancak kaynak kod, bilginin kaybedilebileceği yeni bir yapım sistemine geçerse (örneğin, kaynağı bir lib'e dağıtıyorsanız). Kodun neye ihtiyacı olduğunu bilmesini istiyorum. Bu şekilde daha fazla KURU. :) – paleozogt

cevap

6

Üzerinde belirtilenlerin geçersiz kılma (yani bayrak dosyayı derlemek için

#pragma GCC optimize "no-strict-aliasing" 

kullanabilirsiniz: Örneğin

, böyle bir şey yapabiliriz, bu reklam -fno-strict-aliasing gerek diyelim komut satırı). Ayrıca en az benim sürümü GCC üzerinde, kesinlikle onun için hiçbir #define yoktur

+0

Ah! İstediğimden bile daha iyi! – paleozogt

+0

Bu bayrak gerektiren kırık kodunuzu düzeltmek daha iyi olurdu, bu yüzden aslında geçerli. C. –

+0

Hayır no: katı olmayan takma ile pragma çalışmıyor: https://bugzilla.redhat.com/ show_bug.cgi? id = 486176 – paleozogt

3

... Bir kaynak dosya içinde tek fonksiyona bayrağı uygulamak için

__attribute__((optimize("no-strict-aliasing"))) 

kullanabilirsiniz.

tüm önceden tanımlanmış önişlemci sembolleri görmek için:

g++ -dM -E - < /dev/null 

ben bu seçenekleri sınamak için herhangi bir yolu yoktur sanmıyorum. Ancak, GCC 4.4 veya sonraki bir sürümünü kullanıyorsanız, işlev başına veya dosya bazında belirli seçenekleri etkinleştirmek için "optimize" function attribute veya "optimize" #pragma'u kullanabilirsiniz.

Örneğin, ortak bir başlık dosyasına bu eklerseniz:

#if defined(__GNUC__) 
#pragma GCC optimize ("no-strict-aliasing") 
#else 
#error "You are not using GCC" 
#endif 

... o başlığı içeren her dosya için seçeneğini etkinleştirmeniz gerekir.

[güncelleme]

Tamam bana bu cevabı oluşturmak için çok uzun yaklaşık 10 dakika sürdü bu yüzden. GCC belgelerinin bağlantıları için yine de burada bırakacağım.

+1

Hata no: katı-aliasing ile pragma çalışmıyor: https://bugzilla.redhat.com/show_bug.cgi ? id = 486176 – paleozogt

İlgili konular