7

sigemptysetCygwin で Newlibを使用すると、コンパイラ エラーが発生します。このエラーは C++ コンパイラで発生しますが、使用されている場合のみ-std=XXXです。標準オプションがない場合、テスト プログラムは期待どおりにコンパイルおよび実行されます。

以下にテスト プログラムを示します。関心のある Cygwin ヘッダーが続きます。Cygwin ヘッダーに疑わしいものは何もありません。

#define _GNU_SOURCEや などのトリックを試しました#define _XOPEN_SOURCE 700stdまた、グローバルや名前空間を使用するなどのトリックも試しました。関連して、「-D_XOPEN_SOURCE の機能と意味は何ですか?」を参照してください。c ++ 11の名前空間の問題? .

コンパイルが失敗する原因とその修正方法を教えてください。


$ cat ~/test.cxx 
#include <signal.h>

int main(int argc, char* argv[])
{
    struct sigaction new_handler;
    return sigemptyset(&new_handler.sa_mask);
}

がないと、次の-std=XXXようになります。

$ g++ -c test.cxx
$

を使用すると、次の-std=XXXようになります。

$ g++ -std=c++03 -c test.cxx
test.cxx: In function int main(int, char**):
test.cxx:6:44: error: sigemptyset was not declared in this scope
  return sigemptyset(&new_handler.sa_mask);

そしてsigemptyset、グローバル名前空間で使用しようとすると:

$ g++ -std=c++03 -c test.cxx
test.cxx: In function ‘int main(int, char**)’:
test.cxx:6:12: error: ‘::sigemptyset’ has not been declared
     return ::sigemptyset(&new_handler.sa_mask);
            ^

-std=gnu++03and friendsを使用すると事態はさらに悪化します。

4

2 に答える 2

2

この関数は、ISO C 標準を拡張したものです。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html

そのため、 __XSI_VISIBLE >= 4/usr/include/sys/signal.hによって保護され ています。

詳細については 、を参照/usr/include/sys/features.hしてください。

デフォルトでは最大の定義セットが使用されますが-std=XXX、定義範囲は縮小されます

于 2016-10-05T04:54:54.873 に答える