Bir C kitaplığı için Java ciltleme yazıyorum ve bu nedenle JNI ile çalışıyorum. Oracle specifies, mantıksal olarak, Java ile kullanım için yerel kitaplıkların, çoklu-tanıma gerektiren derleyicilerle derlenmesi gerekir. gcc -D_REENTRANT gerçekten ne yapar?
JNI docs
gcc
için, bu çoklu işlemli-farkındalık gereksinimi makrolar
_REENTRANT
veya
_POSIX_C_SOURCE
birini tanımlayan tarafından karşılanması gerektiğini somut bir örnek verebilir. Bu bana tuhaf geliyor.
_REENTRANT
ve
_POSIX_C_SOURCE
özellik test makrolarıdır. GCC ve POSIX belgeleri, herhangi bir özellik testi makrosu için beklediğim gibi, sembollerin tanımlanması ve beyanların görünür hale getirilmesi açısından etkilerini açıklar.
Ek sembollere veya işlevlere ihtiyacım yoksa, bu makroları aslında benim için yararlı bir şey yapalım mı? Aksi takdirde farklı bir kod üretmek için gcc
neden mi? Kodumun standart kitaplık işlevlerine farklı uygulamalarla bağlantılı olarak çağrılmasına neden olabilirler mi? Yoksa Oracle sadece onun net bölgelerinden mi konuşuyor?
Düzenleme: Ek olarak, yinelemenin iş parçacığından ayrı bir şekilde ele alınması bana göre oluşur. Tek-iş parçacıklı olmayan programlar için bile reentransızlık bir sorun olabilir, bu yüzden Oracle'ın _REENTRANT
'u tanımlamanın önerisi, gcc
'u multithread-aware ile artık daha da şüpheli görünüyor.
Hiç bir şey yok. Özel bir makronun tanımlanmasına gerek kalmadan, dişli sistemli olmayan, erken sistemlerden% 100 eski bir araç. (Ve "reentrant" kelimesini "thread-safe" kelimesiyle karıştırdılar.) –