Kodum, derleme komutlarını, çalışma zamanını tercih etme zamanında oluşturma zamanında hataları işaretlemek ve çalışma zamanında çalışma haklarını yürütmeyerek performansı artırmak için yaygın şekilde kullanır.C derleyici şunları ifade eder: ifadenin nerede sabitlendiği her yerde dinamik olarak nasıl kullanılır?
#define COMPILER_ASSERT(EXPR) switch (0) {case 0: case (EXPR):;}
Hepsi güzel. Aşağıdaki durum için derleyici önermeler kullanmak için bunu genişletmek istiyorum. 100 tanesi denilen bir makronun olduğunu, bunların 99'unun sabit bir değerden geçtiğini ve 1'inin bir değişkeni geçtiğini söyleyin. Makroyu, bir derleyicinin 99 yerde göstermesini sağlamak için kod yazabilirim ve bir çalışma zamanı sonuncusunu gösterir.
MY_FUNCTION() öğesinin her zaman sabit bir değerle çağrıldığını garanti edersem bunu böyle kodlayabilirim. O X'in sabittir garanti, ancak işlevim yapılan her çağrı için yararlanmak isteyen olamazsa
void my_function(int x)
{
//do something
}
#define MY_FUNCTION(X) \
COMPILER_ASSERT(X != 0); \
my_function(X)
//These can all take advantage of a compiler assert.
MY_FUNCTION(1);
MY_FUNCTION(SOME_HASH_DEFINE);
MY_FUNCTION(sizeof(SOME_STRUCTURE));
//This can't (this is a contrived example - actual code is complex).
int some_variable = 1;
MY_FUNCTION(some_variable);
Yani,() nerede olduğunu, nasıl kod? gibi bir şey: Sadece geçmesine sabit değerlere işlevim çağrı Yeniden Kodlama
#define MY_FUNCTION(X) \
if (X is a fixed value) COMPILER_ASSERT(X != 0); \
else assert(X != 0); \
my_function(X)
() benim için bir seçenek değildir. Evet MY_FUNCTION_FIXED_X ve MY_FUNCTION_VARIABLE_X'i tanımlayabilirim ancak bu, tüm bunları arama koduna yansıtır. Yardımlarınız için
teşekkürler. NICKb
Belki de gerçek derleme zamanı olan C11'i kullanabilirsiniz? –
Sabit derken, derleme zamanı sabiti mi demek istiyorsun? Eğer evet ise, müşteri kodundaki 99 çağrıda değer farklı olabilir, doğru mu? – Anon
Doğru. Bir örnek MY_FUNCTION (X) öğesine iletilen değerin belirli bir tamsayı aralığında olması gerektiği ve X'in menzil içinde olduğunu iddia etmek istiyorum. – NickB