2016-07-28 2 views
5

Je me demandais comment utiliser cette fonction, parce que je reçois une erreur quand je fais ceci:Utilisation de la __builtin_add_overflow_p fonction builtin dans 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 

Voici un lien vers les fonctions que je veux utiliser:

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

Voici le Makefile que j'utilise:

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

Quelle version de gcc utilisez-vous? – immibis

+0

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

+0

également essayé avec le compilateur clang – Eagle

Répondre

0

Je compris comment utiliser les fonctions intégrées. Au lieu d'utiliser __builtin_add_overflow_p je __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

Pouvez-vous expliquer la différence entre les deux appels? – 2501

+0

Les fonctions intégrées qui se terminent par un p sont similaires à __builtin_add_overflow, __builtin_sub_overflow et __builtin_mul_overflow. La différence est que les fonctions qui se terminent par un p ne stockent pas le résultat de l'opération arithmétique nulle part et le dernier argument n'est pas un pointeur, mais une expression avec un type intégral autre que le type énuméré ou booléen. Voici un lien vers les types intégraux http://msdn.microsoft.com/en-us/library/exx3b86w%28v=vs.80%29.aspx – Eagle

+1

Je ne vois pas pourquoi ce serait une réponse. Votre question vous a demandé comment utiliser une fonction, et votre solution utilise une autre fonction qui a une définition différente? Mettez-le comme un commentaire à votre question au lieu de dire "pas mon problème plus, mais la question reste". – Andreas