2016-02-01 1 views
5

Je reçois l'erreur suivante lors de la compilation:erreur: « asm » non déclaré (première utilisation dans cette fonction)

error: ‘asm’ undeclared (first use in this function) 
EXCHANGE(s, *(a)); 
^ 

dans un fichier d'en-tête où la macro est invoquée comme suit:

EXCHANGE(s, *(a)); 

et la défintion réelle de la macro se présente comme suit:

#define EXCHANGE(R,M) asm volatile ("xchg %1, %0" : "+m" (M), "+r" (R)) 

invocation macro et définition existe dans la même HEA fichier der. Qu'est-ce qui ne va pas?

J'utilise CMAKE pour construire le projet et CFLAGS sont les suivantes:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-braces") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-field-initializers") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat=2") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wswitch-default") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith") 
#-Wno-deprecated-declarations to suppress the deprecation errors with newer version of JSON-C 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") 
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wbad-function-cast") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-overflow=5") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winline") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wnested-externs") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-cast-qual") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunreachable-code") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-equal") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-aliasing=2") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wold-style-definition") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") 

#set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -O0 -g3 -ggdb") 
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") 
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -E") 
+1

avez-vous essayé d'arrêter la compilation après le traitement préalable en utilisant '-E'? – Aif

+0

Qu'est-ce que -E et comment puis-je l'utiliser? Je construis mon projet via cmake. –

+2

Le mot-clé 'asm' est supporté par votre compilateur. BTW quel compilateur/environnement/IDE/OS utilisez-vous? –

Répondre

6

Vous compilez avec l'option -std=c99.

Cela désactive certaines extensions GCC non standard comme la fonctionnalité asm. Voir https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-std-112 pour une documentation (pas très précise)

Supprimez ou modifiez la ligne set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") de votre cmakefile si vous avez besoin d'un assemblage en ligne.

+0

Ceci est plutôt un commentaire qu'une réponse. –

+0

non. Pas de drapeau '-ansi'. –

+0

Neat, c'est ce que j'ai découvert quand j'ai demandé le drapeau de la compilation. Content que nous l'ayons trouvé. – Aif