triki z użyciem #define
Ostatnio zmodyfikowano 2017-04-09 23:28
robaczek122 Temat założony przez niniejszego użytkownika |
triki z użyciem #define » 2017-04-09 21:59:17 Trochę hakowanie, ale podobno działa. Nie mniej jednak u mnie się nie kompiluje (visual studio 2015). #include <iostream> using namespace std;
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int a:-!!(e); }))
int main() { BUILD_BUG_ON_ZERO( 1 ); return 0; }
Przykład wzięty z http://stackoverflow.com/questions/9229601/what-is-in-c-code?rq=1Sprawdziłem w git blame, że poprzednia wersja wyglądała tak (działa ok): #include <iostream> using namespace std; #define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) int main() { BUILD_BUG_ON_ZERO( 0 ); return 0; }
Moja lekka przeróbka również nie działająca i nie wiem dlaczego: #include <iostream> using namespace std; #define CHECK(x) (struct S { int: x; };) int main() { struct X { int: 1; }; CHECK( 2 ); return 0; }
|
|
jankowalski25 |
» 2017-04-09 23:28:32 A to nie jest przypadkiem kod w języku C? W C++ do takich celów służy static_assert. Masz dwa wyjścia: 1. Jeśli piszesz w C, to nazwij plik *.c zamiast *.cpp, ewentualnie ustaw sobie w IDE kompilację jako C, a nie C++. 2. A jak używasz C++, to korzystaj z mechanizmów C++, a nie jakichś dziwnych sztuczek z C (chyba, że masz dobry powód, aby tak zrobić). |
|
« 1 » |