2012-12-14 15 views
5

Gram z go na tydzień i coś, czego mi brakuje z C to preprocesorowe makra.Makra w stylu C w Go

Co mogę użyć, aby uzyskać tę funkcję, oprócz hacking skryptu build, że rury przejść plików przez clang -E?

+2

Myślę, że tęsknisz za niektórymi z filozofii Go. Na przykład znaczenie przejrzystości. –

+1

Oczywiście jasność jest ważna, ale nie sądzę, aby powtarzanie wielu razy ten sam kod był lepszy dla jasności. –

+5

Jeśli podasz przykład tego, co próbujesz osiągnąć, najprawdopodobniej jest to bardziej "do zrobienia". – Chris

Odpowiedz

7

Jak wspomniano w komentarzach, budować flagi są prawdopodobnie najlepszym sposobem rozwiązania co trzeba. Na przykład, jeśli chcesz mieć niektóre funkcje dostępne tylko w rozwoju, użyj dev flag

constants_dev.go Plik:

// +build dev 
const DEVELOPMENT = true 

constants_pro.go pliku

// +build !dev 
const DEVELOPMENT = false 

Następnie w kod, po prostu zrób prosty if DEVELOPMENT { blah... }. Uważam, że jest to o wiele bardziej czytelne niż jakikolwiek preprocesor. Może to być dość niechlujne, jeśli masz dużo flag kompilacji, ale w tym momencie prawdopodobnie powinieneś używać argumentów wiersza poleceń.

W swoim komentarzu wspomniałeś o powielaniu kodu. Jeśli twój kod jest rzeczywiście taki powtarzalny, prawdopodobnie powinieneś wstawić go do funkcji, lub ewentualnie zrestrukturyzować kod, aby ponownie wykorzystać bity, które są powtarzalne. Osobiście uważam, że wszystko poza prostymi sprawdzeniami boolowskimi kończy się trudnym do utrzymania kodem, szczególnie w makrach w stylu C.

To samo dotyczy leków generycznych. W jednej biblioteki Java używałem, podpis klasy było coś takiego:

class Thing<A, B, C, D, E> 

Biblioteka nie został bardzo dobrze udokumentowane, więc musiałem czytać znaczną ilość kodu (zarówno wdrażania i kod korzysta z biblioteki), aby zrozumieć, co się dzieje.

w Go, język wymusza styl, który z reguły prowadzi do lepszego, samodzielnego dokumentowania kodu. Myślę, że programiści Go pominęli rzeczy takie jak preprocesor i generyczne, aby uniknąć pokusy pisania trudnym do utrzymania, ale sprytny, kod.

radzę wypróbować sposób Go przed patrząc na starych idiomów, które stosowane wcześniej. Myślę, że przekonasz się, że większość użytych makr i #defines jest w dużej mierze nieistotna.

5

myślę CPP, m4 lub cokolwiek może spełnić swoje pragnienie posiadania Go wstępnie przetworzone. Jeśli jest to dobry pomysł, czy nie, jest to twoja decyzja, ale bądź ostrzeżony, że wszelkie wstępne przetwarzanie jest poważną przeszkodą dla przyjęcia opublikowanego kodu Go. (I na przykład budować będąc uzależnionym od makefile jest taka sama historia.)