Forum: Compiler & IDEs c11 error: undefining "__STDC_NO_THREADS__"


von Daniel A. (daniel-a)


Lesenswert?

Da bei meinem OS, einem kubuntu linux in der libc die c11 threads nicht 
implementiert sind, und ich diese in gcc deshalb nicht benutzen konnte, 
wollte ich einen fallback schreiben, welche alle aufrufe für c11 threads 
durch aufrufe für pthread threads ersetzt.

Wenn keine c11 threads verfügbar sind, wird _STDC_NO_THREADS_ 
definiert, also wollte ich folgendes tun:
1
#ifdef __STDC_NO_THREADS__
2
#undef __STDC_NO_THREADS__
3
// fallback
4
#endif

Aber gcc sagt:
1
error: undefining "__STDC_NO_THREADS__" [-Werror]

Kann ich das Problem irgendwie umgehen?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wieso willst du __STDC_NO_THREADS__ undefinen? Meinst du, wenn du es
undefinest, ist der Thread-Support auf einmal da? ;-)

Lass es doch einfach definiert.

von Daniel A. (daniel-a)


Lesenswert?

Yalu X. schrieb:
> Wieso willst du __STDC_NO_THREADS__ undefinen? Meinst du, wenn du es
> undefinest, ist der Thread-Support auf einmal da? ;-)

Nein, ich kümmere mich da ja darum, dass die Funktionen nachher zur 
Verfügung stehen. Bis jetzt habe ich folgendes:
1
#if !defined(THREAD_FALLBACK) && defined(__STDC_NO_THREADS__)
2
#define THREAD_FALLBACK
3
//#ifdef __STDC_NO_THREADS__
4
//#undef __STDC_NO_THREADS__
5
6
#include <pthread.h>
7
#include <errno.h>
8
9
#define thrd_t pthread_t
10
#define thrd_create( thr, func, arg ) pthread_create( thr, 0x0, func, arg )
11
#define thrd_equal( lhs, rhs ) pthread_equal( lhs, rhs )
12
#define thrd_current() pthread_self()
13
#define thrd_sleep( time_point, remaining ) nanosleep( time_point, remaining )
14
#define thrd_yield() sched_yield()
15
#define thrd_exit( res ) pthread_exit( res )
16
#define thrd_detach( thr ) pthread_detach( thr )
17
18
#define mtx_t mutex_wrapper_t
19
#define mtx_lock( mutex ) pthread_mutex_lock( mutex.mutex )
20
#define mtx_trylock( mutex ) mtx_trylock( mutex.mutex )
21
#define mtx_unlock( mutex ) pthread_mutex_unlock( mutex.mutex )
22
#define mtx_destroy( mutex ) ((mutex.type&&pthread_mutexattr_destroy( mutex.attribute )),pthread_mutex_destroy( mutex.mutex ))
23
24
enum {
25
  thrd_success = 0,
26
  thrd_nomem = EAGAIN,
27
  thrd_timedout = ETIMEDOUT,
28
  thrd_busy = EBUSY,
29
  thrd_error = ~0
30
};
31
32
typedef struct {
33
  pthread_mutex_t mutex;
34
  pthread_mutexattr_t attribute;
35
  int type;
36
} mutex_wrapper_t;
37
38
enum {
39
  mtx_plain     = (1<<1),
40
  mtx_recursive = (1<<2),
41
  mtx_timed     = (1<<3)
42
};
43
44
inline int mtx_init( mtx_t* mutex, int type ){
45
  mutex->type = type;
46
  switch(type){
47
    case 0: break;
48
    case mtx_plain:
49
    case mtx_recursive:
50
    case mtx_timed:
51
      pthread_mutexattr_init( &mutex->attribute );
52
    break;
53
    default: return -1;
54
  }
55
  pthread_mutex_init( &mutex->mutex, &mutex->attribute );
56
}
57
58
#endif

Das ist zwar noch unvollständig, aber da danach die Funktionen ja zur 
Verfügung stehen, würde ich gerne dieses makro un-definieren. Ausserdem 
frage ich mich, wieso dass nicht geht?

> Lass es doch einfach definiert.
Das wird wohl die einzige Möglichkeit sein...

von Rolf Magnus (Gast)


Lesenswert?

Wahrscheinlich wird der Compiler dieses Makro irgendwie gesondert 
behandeln. Dürfen tut er das nach ISO C, da alle Namen, die mit zwei 
Unterstrichen gefolgt von einem Großbuchstaben anfangen, reserviert 
sind. Da soll man als Programmierer eigentlich nicht dran rumspielen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Es ist ja auch nicht sehr sinnvoll, dieses Makro wegzudefinieren.

Wenn die C-Standardbibliothek __STDC_NO_THREADS__ definiert, sagt das
aus, dass sie keine Thread-Unterstützung enthält. Selbst wenn man die
fehlenden Funktionen selber nachprogrammiert, sind diese Funktionen
immer noch nicht Bestandteil der Standardbibliothek. Folglich muss auch
__STDC_NO_THREADS__ definiert bleiben.

Aus diesem Grund warnt der GCC beim Wegdefinieren von Makros mit dem
Präfix __STDC_. Auch wenn es nicht ganz sauber ist: Man kann diese
Warnung auch einfach ignorieren. Komplett unterdrücken kann man sie m.W.
aber nicht.

Man könnte die neuen Thread-Funktionen – sofern sie dem Standard
entsprechen – in die (lokal installierte) Standardbibliothek aufnehmen
und dabei die Definition von __STDC_NO_THREADS__ entfernen. Bei der
GLibc ist diese Definition in /usr/inlcude/stdc-predef.h zu finden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.