3

私はhttp://www0.us.ioccc.org/1988/westley.cでプログラムを見ていましたが、別のSOの回答で言及されています-piの値、約3.142を出力することになっていますが、コンパイルして実行するとそれは私が得る0.250。GCCプリプロセッサ(4.1.2と3.4.6の両方がテスト済み)がコードで実行されると、変換されるように見えます

#define _ -F<00||--F-OO--;
_-_-_

-F<00||--F-OO--;- -F<00||--F-OO--;- -F<00||--F-OO--;

しかし、私は、プログラムが機能するためには、

-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;

つまり、GCCは「マクロ」拡張の前に余分なスペースを挿入しています。それはその方法#defineが機能することになっていますか?(1988年から変わっていますか?)

編集:また、それらのスペースが表示されないようにする方法についての情報をいただければ幸いです。

4

4 に答える 4

11

その余分なスペースを挿入しなかったのは、はるかに古いプリプロセッサだけでした。元のエントリは、1989 年版の C 標準が標準化される前の 1988 年に 20 年以上前に提出されたことに注意してください。このフラグを GCC プリプロセッサに渡すと、-traditional-cppISO C プリプロセッサではなく、旧式の C プリプロセッサの動作を模倣できます。

于 2009-05-08T21:09:19.543 に答える
7

プリプロセッサは、厳密にはテキストではなくトークンで動作します。したがって、技術的には間に「スペースを入れる」ことはありませんが、2 つのトークンを演算子と一緒に貼り付けるように明示的に指示しない限り##、それは行われません。この場合、-マクロ行にまたがる 2 つの は 2 つの異なるトークンとしてカウントされます。どちらも減分ではなく、単項マイナスを意味します。

参照: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

于 2009-05-08T20:42:02.180 に答える
5

C99 標準から:

フォームの前処理ディレクティブ

# 識別子置換リストの改行を定義

マクロ名の後続の各インスタンスを、ディレクティブの残りの部分を構成する前処理トークンの置換リストに置き換える、オブジェクトのようなマクロを定義します。

そのため、マクロはトークンで機能し、空白が予想されます。

また、トークンの貼り付け演算子 を使用して必要な出力を取得できますが、##それを行うにはさらに醜いマクロを使用する必要があります。

#define PASTE2( x, y) x##y
#define PASTE( x, y) PASTE2(x, y)

#define _ -F<00||--F-OO--;


PASTE(PASTE(PASTE(PASTE(_,-),_),-),_)

したがって、これがあなたにとって本当の答えであるかどうかはわかりません。

より見栄えの悪いマクロのセットを使用して、必要な式を取得できます。スペースはまだいくつかありますが、スペースは ' --' 演算子の作成を妨げません。

_ PASTE(-,_) PASTE(-,_)

しかし、それがあなたの望むものかどうかはまだ疑問です。

于 2009-05-08T20:44:42.177 に答える
-1

はい、gccは余分なスペースを挿入しています((のstdout出力をチェックして確認してgcc -E westley.cください。私が知る限り、この動作は標準に準拠しています。

于 2009-05-08T20:31:49.197 に答える