Mój kod wykorzystuje szeroko kompilatorowe warianty tak, aby oznaczać błędy w czasie kompilacji przed czasem uruchomienia, a także w celu zwiększenia wydajności, nie wykonując asserts w czasie wykonywania.Kompilator języka C stwierdza: jak dynamicznie używać ich wszędzie tam, gdzie wyrażenie jest poprawione?
#define COMPILER_ASSERT(EXPR) switch (0) {case 0: case (EXPR):;}
Wszystko dobrze. Chciałbym rozszerzyć to, aby użyć kompilatorów dla następujących przypadków. Powiedzmy, że mam makro, które jest wywoływane ze 100 miejsc, z których 99 przekazuje ustaloną wartość, z których 1 przekazuje zmienną. W jaki sposób mogę zakodować makro, aby uczynić to kompilatorem zapewnieniem w 99 miejscach, a awesome w ostatnim.
Gdybym mógł zagwarantować, że funkcja MY_FUNCTION() była zawsze wywoływana z ustaloną wartością, mógłbym ją zakodować w ten sposób.
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);
Tak więc, jeśli nie mogę zagwarantować, że X jest ustalona, ale chcemy wykorzystać dla każdego wywołania My_function() gdzie to jest, jak mogę zakodować je? Coś jak:
#define MY_FUNCTION(X) \
if (X is a fixed value) COMPILER_ASSERT(X != 0); \
else assert(X != 0); \
my_function(X)
Przekodowywanie połączeń do MY_FUNCTION(), aby przekazywać tylko określone wartości, nie jest dla mnie opcją. Tak, mógłbym zdefiniować MY_FUNCTION_FIXED_X i MY_FUNCTION_VARIABLE_X, ale to ujawnia to wszystko do kodu wywołującego.
Dzięki za pomoc. NickB
Może mógłbyś użyć C11, który ma prawdziwe kompilacje? –
Kiedy mówisz "naprawiony", masz na myśli stałą czasu kompilacji? Jeśli tak, wyobrażam sobie, że wartość byłaby inna w 99 wywołaniach kodu klienta, czy to prawda? – Anon
Prawidłowo. Jednym z przykładów jest sytuacja, w której wartość przekazywana do funkcji MY_FUNCTION (X) musi znajdować się w określonym zakresie liczb całkowitych, i chcę potwierdzić, że X jest w zakresie. – NickB