2016-07-28 20 views
5

ja zastanawiałem się, w jaki sposób korzystać z tej funkcji, ponieważ pojawia się błąd, kiedy to zrobić:Korzystanie z wbudowaną funkcję __builtin_add_overflow_p w gcc

#define INT_ADD_OVERFLOW_P(a, b) \ 
__builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0); 
#include <stdio.h> 
#include <assert.h> 
__int main() 
{ 
    int x1 = -1073741826; 
    int y1 = -1073741826; 
    int z1 = x1+y1; 
    INT_ADD_OVERFLOW_P (x1, y1); 
    printf("%d\n",z1); 
    return 0; 
} 

Compile_OUTPUT:

gcc -c -Wall -D DEBUG tempFile.c 
gcc tempFile.o -o tempFile 
Makefile:8: recipe for target 'tempFile' failed//new error after update 

Compile_ERROR:

tempFile.c: In function ‘main’: 
tempFile.c:10:1: warning: implicit declaration of function  ‘__builtin_add_overflow_p’ [-Wimplicit-function-declaration] 
tempFile.o: In function `main': 
tempFile.c:(.text+0x44): undefined reference to `__builtin_add_overflow_p' 
collect2: ld returned 1 exit status 
make: *** [tempFile] Error 1 

Oto link do funkcji, których chcę użyć:

https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html

Oto makefile że używam:

compiler=gcc 
CFLAGS=-c -Wall -D DEBUG 
programname=tempFile 

all: $(programname) 

$(programname): $(programname).o 
    $(compiler) $(programname).o -o $(programname) 

$(programname).o: $(programname).c 
    $(compiler) $(CFLAGS) $(programname).c 

clean: 
    rm *o $(programname) 
+0

Która wersja gcc używasz? – immibis

+0

gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 – Eagle

+0

wypróbował również z kompilatorem clang – Eagle

Odpowiedz

0

więc zorientowali się, jak korzystać z wbudowanych funkcji. Zamiast używać __builtin_add_overflow_p użyłem __builtin_add_overflow

#include <stdio.h> 
#include <assert.h> 

int main(void) 
{ 
    int x1 = -1073741826; 
    int y1 = -1073741826; 
    int z1 = x1 + y1; 
    int temp; 

    printf("%d\n", __builtin_add_overflow(x1, y1, &temp)); 
    if (__builtin_add_overflow(x1, y1, &temp)) { 
    printf("overflow detected"); 
    } 
    printf("%d\n", z1); 

    return 0; 
} 
+0

Czy możesz wyjaśnić różnicę między tymi dwoma połączeniami? – 2501

+0

Wbudowane funkcje zakończone znakiem p są podobne do __builtin_add_overflow, __builtin_sub_overflow i __builtin_mul_overflow. Różnica polega na tym, że funkcje, które kończą się na p, nie przechowują wyniku operacji arytmetycznej w dowolnym miejscu, a ostatni argument nie jest wskaźnikiem, ale pewnym wyrażeniem o typie całki innym niż typ wyliczeniowy lub typ Boolean. Oto link do typów integralnych http://msdn.microsoft.com/en-us/library/exx3b86w%28v=vs.80%29.aspx – Eagle

+1

Nie widzę powodu, dla którego byłaby to odpowiedź. Pytanie, w którym pytasz, jak korzystać z jednej funkcji, a twoje rozwiązanie korzysta z innej funkcji, która ma inną definicję? Umieść to jako komentarz do twojego pytania, zamiast powiedzieć "nie mój problem, ale pytanie pozostaje". – Andreas

Powiązane problemy