Ciçinde aşırı işlevi uygulamak çalışılıyor ve ben çok yakınım. C99 kullanıyorum, bu yüzden C11'de tanıtılan _Generic
anahtar kelimesi bana ulaşılamıyor. Bazı çalışma kodlarını geliştirdim, ama derlediğimde birkaç uyarı alıyorum.Fonksiyon - derleyici uyarıları
Çalışma örneği:
#include <stdio.h>
#define print(x) \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), int ), print_int(x) , \
__builtin_choose_expr(__builtin_types_compatible_p(typeof(x), char[]), print_string(x), \
(void)0))
void print_int(int i) {
printf("int: %d\n", i);
}
void print_string(char* s) {
printf("char*: %s\n", s);
}
int main(int argc, char* argv[]) {
print(1);
print("this");
return 0;
}
Derleme aşağıdaki uyarıları oluşturur: burada, biraz daha ayıklama bilgi için
gcc overload.c -o main
overload.c: In function 'main':
overload.c:19: warning: passing argument 1 of 'print_string' makes pointer from integer without a cast
overload.c:20: warning: passing argument 1 of 'print_int' makes integer from pointer without a cast
ana işlevi önişlemci çalışmalarını yapar sonra neye benzediği:
int main(int argc, char* argv[]) {
__builtin_choose_expr(__builtin_types_compatible_p(typeof(1), int), print_int(1) , __builtin_choose_expr(__builtin_types_compatible_p(typeof(1), char[]), print_string(1), (void)0));
__builtin_choose_expr(__builtin_types_compatible_p(typeof("this"), int), print_int("this") , __builtin_choose_expr(__builtin_types_compatible_p(typeof("this"), char[]), print_string("this"), (void)0));
return 0;
}
Derleme uyarılarını nasıl giderebilirim? Çalışma kodunuz var mı?
Yazılıma "print_string (1)" ve "print_int" ("this") 'e yönelik çağrıların uyarılara neden olduğuna inanıyorum, ancak türler eşleşmediği için bu çağrılar hiçbir zaman olmamalıdır. – tjwrona1992
'print_int (x)' veya 'print_string (x)' yi seçmek yerine, print_int' veya 'print_string' öğesini seçerseniz ve seçilen işlevi (pointer) x'e uygularsanız ne olur? – user2357112
@ user2357112, Bunu yapmayı nasıl yaparım? Fonksiyon işaretçileriyle pek iyi değilim. – tjwrona1992