#ifdef/#ifndef/#else ve if app/if not app komutları nasıl çalışır.

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 28

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
#ifdef/#if defined nedir?
"ifdef" C++ dilinde kontrollü yürütme mekanizmasıdır.
Python'da kullanımı "if app" dır.
Size bu iki komutun kullanım mekanizmasını anlatacağım.


Source dosyalarını tanıyalım:
İlk önce oyunun server source dosyalarından başlayalım;
2 tane temel kaynak dosyası(game ve db) yanında bunların ortak kullanım dosyası(common) dan oluşur.
common'da yaptığınız değişikliklerin etki etmesi için 2 temel kaynak dosyasını da compile(derleme/build) etmeniz gerekir.
ifdef mekanizması genelde server source üzerinde common/service.h üzerinden yürütülür. Ancak başka bir dosyada da tanımlama yapabilirsiniz.

ifdef olarak eklenmiş, tanımlama(define) yapılan dosya include(dahil) edilmemiş ve tanımlaması(defining) yapılmamış olan fonksiyonlar çalışmaz.

İkinci olarak client ve data dosyalarına geçelim.
ifdef mekanizmasını client source dosyaları üzerinde aynı şekilde çalışmakta ancak kontrolü common/service.h üzerinden değil UserInterface/locale_inc.h dosyası üzerinden yapılır.
Burada işin içine data(pack) dosyaları da girer. PythonApplicationModule.cpp üzerinden python dosyalarını kontrol edebilirsiniz ancak .py uzantılı dosyalara bu kontrol mekanizmasını aynı şekilde kuramazsınız.


KULLANIMI:

Python da kullanımı:
if app.KONTROL_MEKANIZMAM:
komutlar


PythonApplicationModule.cpp ->>
PyModule_AddIntConstant(poModule, "KONTROL_MEKANIZMAM", 1);//0 yaparsanız deaktif olur.

eğer bu satır eklenmezse client açılmaz. sonunda bulunan rakam 0 ise kodlar devre dışı kalır.
ayrıca bu satıra #else ekleyerek ifdef ile birlikte
Loncale_inc.h dan da kontrol edebilirsiniz. Else'in ne olduğunu aşşağıdan öğrenebilirsiniz.

C++ da kullanımı:
#ifdef KONTROL_MEKANIZMAM
komutlar2
#endif

service.h->>
#define KONTROL_MEKANIZMAM
eğer bu satır eklenmezse biraz önce belirtmiş olduğumuz komutlar çalışmaz.
locale_inch.h->>
#define KONTROL_MEKANIZMAM
eğer bu satır eklenmezse biraz önce belirtmiş olduğumuz komutlar çalışmaz.


Else nedir?

#ifdef KONTROL_MEKANIZMAM
komutlar2
#else
komutlar
#endif

Burada gördüğünüz else; ifdef ile kontrol koyulan kodların define(tanımlama) yapılmadığı zaman çalışacak kod bloğudur.
Eğer define KONTROL_MEKANIZMAM yazmazsak else satırı devreye girer.

#ifndef/if not defined nedir?
if defined ın tam zıttıdır. if defined, eğer tanımlandıysa demektir. if not defined ise tam aksi şekilde eğer tanımlanmadıysa demektir.
içerisinde bulunan satırlar, eğer tanımlama yapıldıysa devre dışı kalacaktır.

if not app nedir?
if not defined da olduğu gibi bu da python kodlarda kullanabileceğiniz, tanımlama yapıldığında devre dışı kalacak satırları belirtir.


#ifdef/#ifndef/#else ve if app/if not app Komutları Nasıl Çalışır?


Metin2 özel sunucu geliştirme sürecinde C++ temelli sistemlerle çalışırken önişlemci direktifleri büyük rol oynar. Özellikle kaynak kodun farklı derleme yapılandırmalarında farklı davranışlar sergilemesini sağlamak için #ifdef, #ifndef, #else gibi komutlar kullanılır. Bu komutlar sayesinde belirli kod blokları sadece belirli durumlarda derlenir. Aynı zamanda Python tabanlı sistemlerde (örneğin py GUI, UIscript) if app ve if not app gibi koşullarla da benzer işlevsellik sağlanabilir. Bu makalede bu komutların ne işe yaradığını ve nasıl doğru kullanıldığını detaylı olarak ele alacağız.

C++ Preprocessor Directive Nedir?
C++ dilinde önişlemci direktifleri, kod derlenmeden önce derleyici tarafından işlenir. Bu direktifler genellikle # karakteri ile başlar. Örnek olarak #include, #define, #ifdef gibi direktiflerdir. Bu direktifler sayesinde kodun farklı versiyonlara göre farklı davranması sağlanabilir. Özellikle Metin2 özel sunucularında, derleme zamanı seçeneklerine göre belirli özelliklerin aktif edilip edilmemesi gerekir.

#ifdef ve #ifndef Kullanımı
#ifdef, tanımlanmış bir makronun varlığını kontrol eder. Eğer belirtilen makro tanımlanmışsa, kod bloğu derlenir. Örneğin:

Kod:
#ifdef _DEBUG[BR][/BR]cout << 'Debug modunda calisiyor.';[BR][/BR]#endif


#ifndef ise tam tersi şekilde çalışır. Belirtilen makro tanımlı değilse kod bloğu derlenir. Bu, bazı bölümlerin sadece üretim sürümünde olmaması istendiğinde kullanışlıdır:

Kod:
#ifndef _RELEASE[BR][/BR]cout << 'Release surumunde degil.';[BR][/BR]#endif


#else ve #elif ile Koşullu Bloklar
#else direktifi, #ifdef veya #ifndef bloğunun karşıt durumu için kod sağlar:

Kod:
#ifdef _DEBUG[BR][/BR]cout << 'Debug surumunde.';[BR][/BR]#else[BR][/BR]cout << 'Release surumunde.';[BR][/BR]#endif


Ayrıca #elif (else if anlamında) ile birden fazla koşul tanımlanabilir. Bu özellikle birden fazla yapılandırma seçeneği olan sistemlerde faydalıdır.

Python Tarzı Sistemlerde if app/if not app
Metin2 özel sunucularında Python ile yazılmış GUI sistemlerinde veya betiklerde (örneğin UIscript, py GUI) benzer mantıkla if app ve if not app ifadeleri kullanılır. Bu ifadeler, belirli bir uygulamanın veya modülün yüklü olup olmadığını kontrol eder. Örneğin:

Kod:
if app.IsPvPEnabled():[BR][/BR]    print('PvP aktif.') [BR][/BR]else:[BR][/BR]    print('PvP kapali.')


Bu tür kontroller, oyuncu deneyimi üzerinde büyük etkiye sahiptir. PvP sistemlerin aktif olup olmadığı gibi durumlara göre arayüz değişiklikleri yapılabilir.

Pratik Örnek: Metin2 Client SRC'de Kullanım
Metin2 client kaynak kodlarında, bazı fonksiyonlar sadece test sunucusunda aktif olabilir. Bu durumda kod şu şekilde yazılır:

Kod:
#ifdef _TEST_SERVER[BR][/BR]void ShowTestUI() { ... }[BR][/BR]#endif


Bu sayede derleme sırasında _TEST_SERVER tanımlı değilse, ShowTestUI() fonksiyonu derlenmez. Böylece hem güvenlik hem de performans artar.

Sonuç
C++ önişlemcisi ile Python tabanlı sistemlerde kullanılan koşullu yapılar, özellikle Metin2 özel sunucularında dinamik sistemler oluşturmak için oldukça güçlüdür. #ifdef, #ifndef, #else gibi komutlar sayesinde kodun farklı ortamlarda farklı davranması sağlanabilir. if app ve if not app yapıları ise runtime zamanında karar verilmesi gereken durumlarda devreye girer. Bu tür yapıları iyi anlamak, daha esnek ve yönetilebilir sistemler kurmak açısından kritiktir.


How #ifdef/#ifndef/#else and if app/if not app Commands Work


In the process of developing Metin2 private servers using C++ based systems, preprocessor directives play a significant role. Particularly, commands like #ifdef, #ifndef, #else are used to ensure that the source code behaves differently under different build configurations. Thanks to these commands, specific code blocks are compiled only under certain conditions. Similarly, in Python-based systems (such as py GUI, UIscript), similar functionality can be achieved with conditions like if app and if not app. In this article, we will examine in detail what these commands do and how they are properly used.

What is a C++ Preprocessor Directive?
In the C++ language, preprocessor directives are processed by the compiler before the code is compiled. These directives usually begin with the # character, such as #include, #define, #ifdef. Thanks to these directives, the code can behave differently according to different versions. Particularly in Metin2 private servers, activating or disabling certain features based on build-time options becomes possible.

Usage of #ifdef and #ifndef
#ifdef checks whether a defined macro exists. If the specified macro is defined, the code block is compiled. For example:

Kod:
#ifdef _DEBUG[BR][/BR]cout << 'Running in debug mode.';[BR][/BR]#endif


#ifndef works oppositely. If the specified macro is not defined, the code block is compiled. This is useful when certain sections should not appear only in production builds:

Kod:
#ifndef _RELEASE[BR][/BR]cout << 'Not in release version.';[BR][/BR]#endif


Conditional Blocks with #else and #elif
The #else directive provides code for the opposite condition of #ifdef or #ifndef:

Kod:
#ifdef _DEBUG[BR][/BR]cout << 'In debug version.';[BR][/BR]#else[BR][/BR]cout << 'In release version.';[BR][/BR]#endif


Additionally, multiple conditions can be defined using #elif (meaning else if). This is especially useful in systems with multiple configuration options.

Using if app/if not app in Python-like Systems
In Metin2 private servers, similar logic is applied in Python-written GUI systems or scripts (e.g., UIscript, py GUI) using if app and if not app statements. These expressions check whether a particular application or module is loaded. For example:

Kod:
if app.IsPvPEnabled():[BR][/BR]    print('PvP is active.') [BR][/BR]else:[BR][/BR]    print('PvP is disabled.')


Such checks have a major impact on the player experience. User interface changes can be made depending on whether PvP systems are active or not.

Practical Example: Usage in Metin2 Client SRC
In Metin2 client source code, some functions may only be active on test servers. In such cases, the code is written as follows:

Kod:
#ifdef _TEST_SERVER[BR][/BR]void ShowTestUI() { ... }[BR][/BR]#endif


Thus, if _TEST_SERVER is not defined during compilation, the ShowTestUI() function is not compiled. This increases both security and performance.

Conclusion
Conditional structures used in the C++ preprocessor and Python-based systems are very powerful, especially in creating dynamic systems in Metin2 private servers. Commands like #ifdef, #ifndef, #else allow the code to behave differently in various environments. The if app and if not app structures come into play when decisions need to be made at runtime. Understanding these structures well is critical for building more flexible and manageable systems.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt