Aracılığıyla paylaş


#define yönergesi (C/C++)

#define, bir tanımlayıcının veya parametreli tanımlayıcının belirteç dizesiyle ilişkisi olan bir makro oluşturur. Makro tanımlandıktan sonra, derleyici kaynak dosyadaki tanımlayıcının her oluşumu için belirteç dizesini değiştirebilir.

Sözdizimi

#define tanımlayıcı belirteci-dizetercihi
#define tanımlayıcısı ( tanımlayıcıtercihi, ... , tanımlayıcıtercihi ) belirteç dizesitercihi

Açıklamalar

#define yönergesi, derleyicinin kaynak dosyadaki her tanımlayıcı oluşumu için belirteç dizesini değiştirmesine neden olur. Tanımlayıcı yalnızca bir belirteç oluşturulduğunda değiştirilir. Yani, bir açıklamada, dizede veya daha uzun bir tanımlayıcının parçası olarak görünürse tanımlayıcı değiştirilmez. Daha fazla bilgi için bkz . Belirteçler.

Belirteç dizesi bağımsız değişkeni anahtar sözcükler, sabitler veya complete deyimleri gibi bir dizi belirteç içerir. Bir veya daha fazla boşluk karakterinin belirteç dizesini tanımlayıcıdan ayırması gerekir. Bu boşluk, değiştirilen metnin parçası olarak kabul edilmez ve metnin son belirtecini izleyen boşluk yoktur.

#define Belirteç dizesi olmayan bir, kaynak dosyadan tanımlayıcı oluşumlarını kaldırır. Tanımlayıcı tanımlı kalır ve ve #ifdef yönergeleri kullanılarak #if defined test edilebilir.

İkinci söz dizimi formu, parametrelerle işlev benzeri bir makro tanımlar. Bu form, parantez içinde görünmesi gereken isteğe bağlı bir parametre listesini kabul eder. Makro tanımlandıktan sonra, tanımlayıcının sonraki her oluşumu ( tanımlayıcıtercihi, ..., tanımlayıcıtercihi ) resmi parametrelerle değiştirilen gerçek bağımsız değişkenler içeren belirteç dizesi bağımsız değişkeninin bir sürümüyle değiştirilir.

Gerçek değerlerin değiştirildiği konumları işaretlemek için belirteç dizesinde resmi parametre adları görüntülenir. Her parametre adı belirteç dizesinde birden çok kez görünebilir ve adlar herhangi bir sırada görünebilir. Çağrıdaki bağımsız değişkenlerin sayısı, makro tanımındaki parametre sayısıyla eşleşmelidir. Parantezlerin serbest kullanımı, karmaşık gerçek bağımsız değişkenlerin doğru yorumlandığını garanti eder.

Listedeki resmi parametreler virgülle ayrılır. Listedeki her ad benzersiz olmalı ve listenin parantez içine alınması gerekir. Hiçbir boşluk tanımlayıcıyı ve açma parantezini ayıramıyor. Birden çok kaynak satırdaki uzun yönergeler için satır birleştirmeyi kullanın ( yeni satır karakterinden hemen önce bir ters eğik çizgi (\) yerleştirin. Resmi parametre adının kapsamı, belirteç dizesini sona erdiren yeni satıra kadar uzanır.

İkinci söz dizimi formunda bir makro tanımlandığında, izleyen metinsel örnekler ve ardından bir bağımsız değişken listesi makro çağrısını gösterir. Kaynak dosyadaki bir tanımlayıcı örneğini izleyen gerçek bağımsız değişkenler, makro tanımındaki karşılık gelen resmi parametrelerle eşleştirilir. Belirteç dizesindeki her biçimsel parametrenin başında dize oluşturma (), karakterize etme (##@) veya belirteç yapıştırma (##) işleci olmayan veya bir ## işleç tarafından takip edilmeyen her bir resmi parametre, karşılık gelen gerçek bağımsız değişkenle değiştirilir. Yönerge resmi parametrenin yerini almadan önce gerçek bağımsız değişkendeki tüm makrolar genişletilir. (İşleçler Ön işlemci işleçleri.)

Bağımsız değişkenler içeren aşağıdaki makro örnekleri, #define söz diziminin ikinci biçimini gösterir:

// Macro to define cursor lines
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Yan etkileri olan bağımsız değişkenler bazen makroların beklenmeyen sonuçlar üretmesine neden olur. Belirli bir resmi parametre, belirteç dizesinde birden fazla kez görünebilir. Bu resmi parametre yan etkileri olan bir ifadeyle değiştirilirse, yan etkileri olan ifade birden fazla kez değerlendirilebilir. (Aşağıdaki örneklere bakın: Belirteç Yapıştırma İşleci (##).)

yönergesi #undef , tanımlayıcının önişlemci tanımının unutulmalarına neden olur. Daha fazla bilgi için bkz . #undef Yönergesi .

Tanımlanan makronun adı belirteç dizesinde oluşuyorsa (başka bir makro genişletmesinin sonucu olarak bile), genişletilmemiştir.

Aynı ada sahip bir makro için ikinci bir #define , ikinci belirteç dizisi ilkiyle aynı olmadığı sürece bir uyarı oluşturur.

Microsoft'a Özgü

Microsoft C/C++, yeni tanım özgün tanımla aynıysa makroyu yeniden tanımlamanıza olanak tanır. Başka bir deyişle, iki tanım farklı parametre adlarına sahip olabilir. Bu davranış ANSI C'den farklıdır ve iki tanımın sözcük bakımından aynı olmasını gerektirir.

Örneğin, parametre adları dışında aşağıdaki iki makro aynıdır. ANSI C böyle bir yeniden tanımlamaya izin vermez, ancak Microsoft C/C++ hatasız olarak derler.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

Öte yandan, aşağıdaki iki makro aynı değildir ve Microsoft C/C++'da bir uyarı oluşturur.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

END Microsoft'a Özgü

Bu örnekte #define yönergesi gösterilmektedir:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

İlk deyim tanımlayıcıyı WIDTH 80 tamsayı sabiti olarak tanımlar ve ve 10 tamsayı sabiti WIDTH açısından tanımlarLENGTH. Her geçtiği yer LENGTH (WIDTH + 10 ile değiştirilir. Buna karşılık, her oluşum WIDTH + 10 ifadesi (80 + 10 ile değiştirilir. Aşağıdaki gibi deyimlerdeki yorumlamayı denetledikleri için çevresindeki WIDTH + 10 parantezler önemlidir:

var = LENGTH * 20;

Ön işleme aşamasından sonra deyimi şöyle olur:

var = ( 80 + 10 ) * 20;

1800 olarak değerlendirilir. Parantezler olmadan sonuç:

var = 80 + 10 * 20;

280 olarak değerlendirilir.

Microsoft'a Özgü

/D derleyici seçeneğiyle makroları ve sabitleri tanımlamak, dosyanızın başında #define ön işleme yönergesi kullanmakla aynı etkiye sahiptir. /D seçeneği kullanılarak en fazla 30 makro tanımlanabilir.

END Microsoft'a Özgü

Ayrıca bkz.

Önişlemci yönergeleri