Bonjour,
J'ai etudie une partie du code de Linux et certaines
definitions sont encapsulee dans do{.....}while(0)
exemple:
#define spin_lock_init(x) do { (x)->lock = 0; } while(0)
pourquoi ???
merci
Bonjour,
J'ai etudie une partie du code de Linux et certaines
definitions sont encapsulee dans do{.....}while(0)
exemple:
#define spin_lock_init(x) do { (x)->lock = 0; } while(0)
pourquoi ???
merci
Ceci est tiré de www.kernelnewbies.org
ZUL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 There are a couple of reasons: (from Dave Miller) Empty statements give a warning from the compiler so this is why you see #define FOO do { } while(0). (from Dave Miller) It gives you a basic block in which to declare local variables. (from Ben Collins) It allows you to use more complex macros in conditional code. Imagine a macro of several lines of code like: #define FOO(x) \ printf("arg is %s\n", x); \ do_something_useful(x); Now imagine using it like: if (blah == 2) FOO(blah); This interprets to: if (blah == 2) printf("arg is %s\n", blah); do_something_useful(blah);; As you can see, the if then only encompasses the printf(), and the do_something_useful() call is unconditional (not within the scope of the if), like you wanted it. So, by using a block like do{...}while(0), you would get this: if (blah == 2) do { printf("arg is %s\n", blah); do_something_useful(blah); } while (0); Which is exactly what you want. (from Per Persson) As both Miller and Collins point out, you want a block statement so you can have several lines of code and declare local variables. But then the natural thing would be to just use for example: #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; } However that wouldn't work in some cases. The following code is meant to be an if-statement with two branches: if(x>y) exch(x,y); // Branch 1 else do_something(); // Branch 2 But it would be interpreted as an if-statement with only one branch: if(x>y) { // Single-branch if-statement!!! int tmp; // The one and only branch consists tmp = x; // of the block. x = y; y = tmp; } ; // empty statement else // ERROR!!! "parse error before else" do_something(); The problem is the semi-colon (;) coming directly after the block. The solution for this is to sandwich the block between do and while(0). Then we have a single statement with the capabilities of a block, but not considered as being a block statement by the compiler. Our if-statement now becomes: if(x>y) do { int tmp; tmp = x; x = y; y = tmp; } while(0); else do_something();
cool, merci pour ta reponse claire et precise !
j'en profite pour te (vous) demander ou je pourrais trouver une doc
sur les principes d'utilisation des fonctions inline avec gcc.
En effet, toujours dans le code de Linux, on peut voir
- des static inline fonction() dans des .h
- des extern inline fonction()
merci
sur le meme site que cité précédemment. Dans la section FAQ.
ZUL
desole !
j'ai survole le site mais j'avais pas vu !
merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager