C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

muhittin_kaplan

yeri gelmişken sorayım PreProcess komutları (derleme öncesi komutlar) kullanılmasının amacı,
tekbir programla çeşitli ayarlarda programı aynı çatı altına almakmıdır ? Başka Amacı varmıdır
(yukarda tagli örnek vermiş)

fatih6761

Muhittin hocam makrolarda preprocess komutlarıdır. Gerekirse fonksiyon yerine de kullanılır.
#define DEBUG veya #define __GCC__ gibi tanımlar birer ayardır.
#define PI 3 dediğinizde PI değişkenine 3 aktarma yapılmaz. Preprocessten geçince PI yazan her yere 3 konur. Hatta utf stringlere eklenen L makrosuda bunun gibidir.
#define GET_BIT(a,b) a & (1 << b)
Burada GET_BIT fonskiyonu oluşmaz. Preprocess esnasında GET_BIT() kullanılan her yere parametre isimleri değiştirilerek makroya yazdığınız tanım yerleştirilir.

Tagli

Genelde koşullu derleme için kullanılıyor. Bazen makro oluşturmak için de kullanılıyor ama bu tartışmalı bir konu. Genel kanı makroların tehlikeli olduğu yönünde.

Wikipedia'da kullanım alanları örneklerle birlikte gösterilmiş: http://en.wikipedia.org/wiki/C_preprocessor
Gökçe Tağlıoğlu

iruraz

@Tagli, @fatih6761 açıklamalar için teşekkürler..

arslan74

Alıntı yapılan: iruraz - 15 Kasım 2013, 19:31:30
@arslan74 hocam, örnekten ve anlattıklarınızdan sonra kafamda şöyle bir şey oluştu:

"islemci_a" seni yoktan var ettim ama şimdilik hiçbir şey değilsin. Ne olacağını, hayatın (burada tabi ki kodun :) ) akışı belirleyecek.

Olayı bu şekilde özetlesem doğru olur mu?

Olmayan bir şeyi tanımlamanın bir anlamı ve amacı olmaz. Kodu biz olan bir şeye göre yazarız. Kodumuzda iki veya daha fazla farklı işlemcileri veya özellikleri belirtmek ve ayırt etmek için kullanılır.




iruraz

Alıntı yapılan: arslan74 - 15 Kasım 2013, 23:17:42
Olmayan bir şeyi tanımlamanın bir anlamı ve amacı olmaz. Kodu biz olan bir şeye göre yazarız. Kodumuzda iki veya daha fazla farklı işlemcileri veya özellikleri belirtmek ve ayırt etmek için kullanılır.

@arslan74  hocam,

Benzetmemde "yoktan var ettim" derken "amaçsız yarattım" demek istemedim. Seni bir amaç için yarattım ama ne için kullanılacağın ve ne olacağın kodun akışında belli olacak demek istemiştim.

Konu benim açımdan açıklığa kavuştu. Yardımcı olanlara tekrar teşekkür ederim..

muhittin_kaplan

ilginç bir benzetme olmuş. ama sevdim.

kantirici

Merhaba,

Bir kütüphane olarak kullandığım .c ve .h dosyalarında .c içerisinde tanımladığım global bir değişken var. Bu değişkene main ve  diğer .c dosyalarında nasıl erişim sağlarım?

AsHeS

#683
Alıntı yapılan: kantirici - 07 Aralık 2013, 23:43:58
Merhaba,

Bir kütüphane olarak kullandığım .c ve .h dosyalarında .c içerisinde tanımladığım global bir değişken var. Bu değişkene main ve  diğer .c dosyalarında nasıl erişim sağlarım?
Header dosyası içerisinde veya kullanacağın yerde

extern <degiskentipi>  <degiskenismi>
extern int variable;

yazarsan kullanabilirsin.

kantirici


atioky_216

Merhaba şu şekilde tanımlamaları daha önceden kullanmadım, bir stack yapısı ile çalıştığım için (C sadece) belki de yeni karşılaşıyorumdur.

#ifndef  x_API
#define x_API
#endif


Ben şu şekilde beklerdim, eğer x_API bir şekilde tanımlanmış ise (preprocessor de mesela, IAR orneği verirsem)

#define x_API birşeyler


derdim. Ama bu şekilde hiçbir tanımlama bulunmuyor. Daha sonradan şu şekilde fn-lar felan tanımlanmış:
x_API void xyz(void)
{
  /* başka şeyler*/
birfn();
ikifn();
}


Bunu ya bir yerlerde typedef ile tanımlamışlar yada benim bilmediğim C dilinin bir özelliği. (Yazdıkları .lib'den çekiyor olabilir)
Ne acaba?

Tagli

atioky_216, ilk sorunun cevabı yine bu başlıkta bir sayfa önce (48) verilmişti.

İkinci kullanımı ben de ilk defa görüyorum, maalesef hiçbir fikrim yok. Önce "makro mu acaba?" dedim ama ona da benzemiyor pek.
Gökçe Tağlıoğlu

Gökhan BEKEN

Alıntı yapılan: atioky_216 - 12 Aralık 2013, 15:10:43
x_API void xyz(void)
{
  /* başka şeyler*/
birfn();
ikifn();
}

bunda birşey yok ki normal #define gibi.

#define x_API public static
x_API void xyz(void)
{
  /* başka şeyler*/
birfn();
ikifn();
}

ha böyle yazmışsınız
ha böyle:
public static void xyz(void)
{
  /* başka şeyler*/
birfn();
ikifn();
}



Özel mesaj okumuyorum, lütfen göndermeyin.

atioky_216

Alıntı yapılan: Tagli - 12 Aralık 2013, 16:08:46
atioky_216, ilk sorunun cevabı yine bu başlıkta bir sayfa önce (48) verilmişti.

İkinci kullanımı ben de ilk defa görüyorum, maalesef hiçbir fikrim yok. Önce "makro mu acaba?" dedim ama ona da benzemiyor pek.

Topluca yazmadığım için farklı anlaşıldı ilk yapı
#ifndef  x_API
#define x_API birseyler
#endif

şeklinde tanımlamada anlaşılmayacak bir şey yok zaten. Benim merak ettiğim herhangi şekilde (eğer düşündüğüm şekilde varsa tabi)
#define x_API herhangibirtur
şeklinde tanımlama goremedim.Sadece şu şekilde tanımlayıp:
#ifndef  x_API
#define x_API 
#endif

daha sonrasında (sanki bir tur gibi) fn- ile beraber kullanılması ilk defa karşılaştığım bir şey. Dediğim gibi herhangi bir yerde x_API tanımlaması ve ne olduğunu da bulamadım.
@gerbay galiba sizin bahsettiğiniz durum oluyor bu. Ben iyice bakayım.
Ama gerçekten merak etmiştim:

#ifndef  x_API
#define x_API 
#endif


şekilde yazılmasındaki amaç nedir? Tanımlama felanda yok, insanı şaşırtıyor.

atioky_216

#689
Alıntı yapılan: gerbay - 12 Aralık 2013, 17:13:00
o da eğer derleyiciye x_API nin ne olduğu define edilmezse derlemede hataolmasın diye alınan bir güvenlik önlemi.. eğer x_API nin ne olduğu bildirilmezse fonsiyonların başındaki x_API ler derleme sırasında kaldırılıyormuş gibi düşünün..

O zaman yazdığım eğer define edilmemiş ise define edilmesi için bu. Bu proproc. kısmında pek bilgim yoktu bu zmana kadar sadece #define a b
vs... Detay gördüğüm şeyleri yeniden karıştırmam gerekiyor.

NOT: Evet @gerbay özellikle derleme sırasında header kullanırken tam da dediğiniz gibi işe yarıyor imiş yeni öğrendim.