【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22758

arrsert()関数について
投稿者---仁(2005/08/20 18:44:26)


関数型マクロである、 assert()は式 expression が 偽 の場合に診断
メッセージを表示して関数 abort()を呼び出し終了しますが、

以下、簡単なソースですが、
#include <stdio.h>
#include <assert.h>

#define NDEBUG

main()
{
    int num;

    num = 3;
    assert(num == 0);

    num += 2;

    printf("[%d]\n",num);
}


gcc -o test test.c

とコンパイルし、実行すると、異常終了します。

assertを無効にしたいのですが、コンパイル時に何を設定すれば
よいのですか。

manコマンドで調べたのですが、optionに -DNDEBUG を指定あった
のですが、コンパイル時にワーニングがでます。

gcc -DNDEBUG -o test test.c

test.c:4:1: warning: "NDEBUG" redefined
<command line>:1:1: warning: this is the location of the previous definition

環境は、
Solaris8、gcc です。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:arrsert()関数について 22759 NykR 2005/08/20 19:06:15
<子記事> Re:arrsert()関数について 22760 まきじ 2005/08/20 20:12:18
<子記事> Re:arrsert()関数について 22761 RiSK 2005/08/20 21:56:31
<子記事> Re:arrsert()関数について 22762 2005/08/21 00:59:59


No.22759

Re:arrsert()関数について
投稿者---NykR(2005/08/20 19:06:15)


>manコマンドで調べたのですが、optionに -DNDEBUG を指定あった
>のですが、

それでいいです。

>     コンパイル時にワーニングがでます。
>
>gcc -DNDEBUG -o test test.c
>
>test.c:4:1: warning: "NDEBUG" redefined
><command line>:1:1: warning: this is the location of the previous definition

ソースファイル中の
#define NDEBUG
を消せば警告は消えます。

# assert.hをインクルードした後でNDEBUGをdefineしても意味はありません。


この投稿にコメントする

削除パスワード

No.22760

Re:arrsert()関数について
投稿者---まきじ(2005/08/20 20:12:18)


MSDN より引用

デバッグの終了後は、識別子 NDEBUG を定義しておけばソース ファイルを修正せずに、アサーションによるチェックをオフにできます。NDEBUG の定義は、/D コマンド ライン オプションまたは #define ディレクティブを使用して行います。#define を使用して NDEBUG を定義する場合は、Assert.h のインクルードよりも前にこのディレクティブを記述する必要があります。


この投稿にコメントする

削除パスワード

No.22761

Re:arrsert()関数について
投稿者---RiSK(2005/08/20 21:56:31)


-DNDEBUG によって NDEBUG が定義され,
さらにソース中で #define NDEBUG しているので警告が出ます。

オプションで -DNDEGBUG する
#include <assert.h> の前に #define NDEBUG する

のどちらかだけでOK.


この投稿にコメントする

削除パスワード

No.22762

Re:arrsert()関数について
投稿者---仁(2005/08/21 00:59:59)


ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧