Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

triki z użyciem #define

Ostatnio zmodyfikowano 2017-04-09 23:28
Autor Wiadomość
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).

C/C++
#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=1
Sprawdziłem w git blame, że poprzednia wersja wyglądała tak (działa ok):
C/C++
#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:
C/C++
#include <iostream>
using namespace std;
#define CHECK(x) (struct S { int: x; };)
int main()
{
    struct X { int: 1; }; //skoro to się kompiluje
    CHECK( 2 ); //to czemu to już nie?
   
    return 0;
}
P-160036
jankowalski25
» 2017-04-09 23:28:32
using namespace std;
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ć).
P-160041
« 1 »
  Strona 1 z 1