sedを使用してファイル内の最初の出現のみを置き換える方法は?


217

既存の#includeの前に追加のincludeディレクティブを使用して、多数のC ++ソースファイルを更新したいと思います。この種のタスクでは、通常、sedで小さなbashスクリプトを使用してファイルを再書き込みします。

sedすべての出現を置き換えるのではなく、ファイル内の文字列の最初の出現のみを置き換えるにはどうすればよいですか?

私が使うなら

sed s/#include/#include "newfile.h"\n#include/

すべての#includeを置き換えます。

同じことを達成するための代替案も歓迎します。

回答:


135
 # sed script to change "foo" to "bar" only on the first occurrence
 1{x;s/^/first/;x;}
 1,/foo/{x;/first/s///;x;s/foo/bar/;}
 #---end of script---

または、必要に応じて:編集者注:GNUで sedのみ動作します

sed '0,/foo/s//bar/' file 

ソース


86
私は「またはあなたが望むなら」の解決策を好むと思います。また、回答を説明し、回答を質問に直接対応させて、一般化するだけでなく、一般化するとよいでしょう。しかし、良い答えです。
ジョナサンレフラー

7
Macユーザー向けの参考情報:0を1に置き換える必要があるため、sed '1、/ RE / s // to_that /' file
mhost

1
@mhostいいえ、パターンが行#1に見つかった場合は置換され、パターンが他の行にある場合は置換されませんが、それでも最初に見つかったパターンです。PSこれはことを言及する必要があります0,だけで動作しますgnu sed
Jotne

11
誰かが「またはあなたが優先するかどうか」の解決策を説明できますか?「from」パターンをどこに置くかわかりません。
Jean-Luc Nacif Coelho

3
@ Jean-LucNacifCoelho:s//-つまり空の正規表現を使用すると、最後に適用された正規表現が暗黙的に再利用されます。この場合は、RE。この便利なショートカットは、s呼び出しで範囲終了の正規表現を複製する必要がないことを意味します。
mklement0

289

sed唯一の「バナナ」で「アップル」の最初の出現を交換するスクリプト

     Input:      Output:

     Apple       Banana
     Apple       Apple
     Orange      Orange
     Apple       Apple

これは単純なスクリプトです。編集者のメモ:GNUで sedのみ機能します

sed '0,/Apple/{s/Apple/Banana/}' input_filename

最初の2つのパラメータ0/Apple/範囲指定されています。s/Apple/Banana/その範囲内で実行されているものです。だから、最初の範囲内で、この場合」の(0)までの最初のインスタンスにApple、交換してくださいAppleBanana。初回のみApple置き換えられます。

背景:従来sedの範囲指定子は「ここから開始」および「ここから終了」含みます。ただし、最下位の「begin」は最初の行(1行目)であり、「end here」が正規表現の場合、「begin」の後の次の行に対してのみ照合が試みられるため、最も早い可能な終了はlineです。 2.したがって、範囲は包括的であるため、可能な最小範囲は「2行」であり、最小開始範囲は両方とも1行目と2行目です(つまり、1行目にオカレンスがある場合、2行目のオカレンスも変更されますが、この場合は望ましくありません) )。GNUsedは、「pseudo」としてstartを指定できるようにする独自の拡張を追加しline 0、範囲の終わりをにしてline 1、「最初の行のみ」の範囲を許可できるようにします。

または、簡略化されたバージョン(空のREライク//は、その前に指定されたものを再利用することを意味するため、これは同等です)

sed '0,/Apple/{s//Banana/}' input_filename

中括弧はコマンドのオプションであるため、sこれも同等です。

sed '0,/Apple/s//Banana/' input_filename

これらはすべてGNUでsedのみ動作します。

また、homebrewを使用してOS XにGNU sedをインストールすることもできbrew install gnu-sedます。


166
人間の言語に翻訳:0行目から開始し、「Apple」に一致するまで続行し、中括弧で置換を実行します。cfr
mariotomo

8
OS Xでは、私が取得sed: 1: "…": bad flag in substitute command: '}'
ELLIOTTCABLE

5
OS Xでは@ELLIOTTCABLE、を使用しますsed -e '1s/Apple/Banana/;t' -e '1,/Apple/s//Banana/'。@MikhailVSの答えから(現在)下にあります。
djb 2015

8
ブラケットなしでも機能します:sed '0,/foo/s/foo/bar/'
Innokenty

5
これでsed: -e expression #1, char 3: unexpected 、 '`が出ます
ジョナサン

56
sed '0,/pattern/s/pattern/replacement/' filename

これは私のために働いた。

sed '0,/<Menu>/s/<Menu>/<Menu><Menu>Sub menu<\/Menu>/' try.txt > abc.txt

編集者注:どちらもGNUで sedのみ動作します


2
@Landysこれでも、他の行のインスタンスが置き換えられます。最初のインスタンスだけでなく
sarat 2015

1
@saratはい、そうです。sed '1,/pattern/s/pattern/replacement/' filenameMacで「最初の行にパターンが発生しない」場合にのみ機能します。以前のコメントは正確ではないため、削除します。詳細はこちら(linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/…)にあります。Andyの回答はGNU sedでのみ機能し、Macでの回答では機能しません。
Landys、2015

45

説明が補足された、多くの役立つ既存の回答概要

ここの例では、単純化された使用例を使用しています。最初の一致する行でのみ「foo」を「bar」に置き換えます。
原因は、使用する(ANSI C-引用符で囲まれた文字列$'...'、サンプル入力ラインを提供するためにbashkshまたはzshシェルとして想定されます。


GNU sedのみ:

ベンHoffsteinのanwswerの GNUを提供することを示している私達拡張子するために、POSIX仕様sed、次のことができますその2-アドレスの形式0,/re/reここでは、任意の正規表現を表しますが)。

0,/re/正規表現を最初の行でも一致させることができます。言い換えれば、そのようなアドレスが一致すること線を含むまで1行目までの範囲と作成するre-かre1ラインまたは任意の後続ラインで発生します。

  • POSIX準拠の形態とは対照的1,/re/範囲を作成し、それへと線を含めて最大1行目から一致していることを一致re後続行; 他の言葉で:これは、最初の発生を検出しませんre、上で発生することが発生した場合、一致を第一ラインとも速記の使用防止//、最近使用正規表現の再利用のために(次のポイントを参照してください)。1

同じ正規表現を使用0,/re/するs/.../.../(置換)呼び出しとアドレスを組み合わせる場合、コマンドは事実上、一致する最初の行でのみ置換を実行します。re
sed便利提供し、最も最近適用正規表現再利用するためのショートカット、区切り文字のペアを//

$ sed '0,/foo/ s//bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo' 
1st bar         # only 1st match of 'foo' replaced
Unrelated
2nd foo
3rd foo

sedBSD(macOS)などのPOSIX機能のみ(sedGNU でも動作しますsed):

0,/re/使用できず、フォーム1,/re/re最初の行(上記を参照)で発生したかどうかを検出しないため、1行目の特別な処理が必要です

MikhailVSの答えは、ここで具体的な例に入れられたテクニックについて言及しています:

$ sed -e '1 s/foo/bar/; t' -e '1,// s//bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar         # only 1st match of 'foo' replaced
Unrelated
2nd foo
3rd foo

注意:

  • ここでは、空の正規表現//ショートカットが2回使用されていsます。どちらの場合も、正規表現fooは暗黙的に再利用されるため、複製する必要がないため、コードが短く、保守しやすくなります。

  • POSIX sedは、ラベルの名前の後や省略など、特定の機能の後に実際の改行を必要とします。tです。スクリプトを複数の-eオプションに戦略的に分割することは、実際の改行を使用する代わり-eになります。通常、改行を挿入する必要がある各スクリプトチャンクを終了します。

1 s/foo/bar/ 置き換える foo見つかった場合、1行目のみをます。その場合t、スクリプトの最後に分岐します(行の残りのコマンドをスキップします)。(t関数は、最新のs呼び出しが実際の置換を実行した場合にのみラベルに分岐します。ここでは、ラベルがない場合、スクリプトの最後に分岐します)。

すなわち、範囲アドレス発生した場合1,//、通常、最初の発生を発見し、ライン2から出発して、意志はありませんと一致し、且つ範囲があろうない現在の行が既にある場合に、アドレスが評価されるので、処理されます2

逆に、1行目に一致がない場合、 1,// します入力すると、真の最初の試合があります。

正味の効果は、GNU sedの場合と同じ0,/re/です。1行目で発生したかどうかに関係なく、最初の発生のみが置き換えられます。


非範囲アプローチ

ポトンの答えは、範囲の必要性を回避するループ技術を示しています。彼はGNU sed構文を使用しているので、POSIX準拠の同等のものを次に示します。

ループ手法1:最初の一致で置換を実行してから、残りの行をそのまま出力するループに入る

$ sed -e '/foo/ {s//bar/; ' -e ':a' -e '$!{n;ba' -e '};}' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar
Unrelated
2nd foo
3rd foo

ループテクニック2、小さめのファイルのみ入力全体をメモリに読み込み、それに対して単一の置換を実行します

$ sed -e ':a' -e '$!{N;ba' -e '}; s/foo/bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar
Unrelated
2nd foo
3rd foo

1 1.61803を用いて何が起こるかの例を提供1,/re/して、後続することなく、s//
- sed '1,/foo/ s/foo/bar/' <<<$'1foo\n2foo'収率$'1bar\n2bar'。つまり、行番号が最初の行と一致するため、両方の行が更新され、1正規表現(/foo/範囲の終わり)は次の行から開始するためにのみ検索されます。したがって、この場合は両方の行が選択され、両方に対してs/foo/bar/置換が実行されます。
- sed '1,/foo/ s//bar/' <<<$'1foo\n2foo\n3foo' 失敗sed: first RE may not be empty(BSD / macOS)およびsed: -e expression #1, char 0: no previous regular expression(GNU)を使用します。これは、1行目が処理されているとき(行番号1が範囲の始まりであるため)、まだ正規表現が適用されていないためです。//何も参照していません。
GNUの例外を除いてsedの特別0,/re/な構文、いかなるで始まること範囲ライン数が効果的の使用を排除します//


25

awkを使用して同様のことを行うことができます。

awk '/#include/ && !done { print "#include \"newfile.h\""; done=1;}; 1;' file.c

説明:

/#include/ && !done

行が「#include」と一致し、まだ処理していない場合、{}の間にアクションステートメントを実行します。

{print "#include \"newfile.h\""; done=1;}

これは#include "newfile.h"を出力します。引用符をエスケープする必要があります。次に、done変数を1に設定して、インクルードを追加しないようにします。

1;

これは「行を出力する」ことを意味します-空のアクションはデフォルトで$ 0を出力し、行全体を出力します。ワンライナーで、sed IMOよりも理解しやすい:-)


4
この答えは、に依存しているsedのソリューションを、よりポータブルであるGNU SEDなど。(例えばOS-Xでsedは吸う!)
ジェイ・テイラー

1
これは本当に理解しやすいですが、私にとってはそれを置き換えるのではなく行を追加します。使用したコマンド: awk '/version/ && !done {print " \"version\": \"'${NEWVERSION}'\""; done=1;}; 1;' package.json
Cereal Killer

ここでも同じですが、最もわかりやすいコマンドですが、見つかった文字列の上に、置換するのではなく行を追加します
Flion

1
答えはかなり読みやすいです。これは、新しい行を追加する代わりに文字列を置き換える私のバージョンです。awk '/#include/ && !done { gsub(/#include/, "include \"newfile.h\""); done=1}; 1' file.c
Orsiris de Jong

18

linuxtopia sed FAQに関するかなり包括的な回答集。また、人々が提供したいくつかの回答が、GNU以外のバージョンのsedでは機能しないことも強調しています。たとえば、

sed '0,/RE/s//to_that/' file

非GNUバージョンでは

sed -e '1s/RE/to_that/;t' -e '1,/RE/s//to_that/'

ただし、このバージョンはgnu sedでは動作しません。

両方で動作するバージョンは次のとおりです。

-e '/RE/{s//to_that/;:a' -e '$!N;$!ba' -e '}'

例:

sed -e '/Apple/{s//Banana/;:a' -e '$!N;$!ba' -e '}' filename

実際、Ubuntu Linux v16とFreeBSD v10.2で動作確認済みです。ありがとうございます。
ソパラホデアリエーレス

12
#!/bin/sed -f
1,/^#include/ {
    /^#include/i\
#include "newfile.h"
}

このスクリプトの動作:1から最初の#include行(1行目以降)までの行で、行がで始まる場合は#include、指定した行を先頭に追加します。

ただし、最初の#include行が1行目にある場合は、1 行目と次の行の両方#includeに行が追加されます。GNUを使用している場合sed、それは0,/^#include/(の代わりに1,)正しいことを行う拡張機能を持っています。


11

最後に出現回数を追加するだけです:

sed s/#include/#include "newfile.h"\n#include/1

7
残念ながら、これは機能しません。これは、ファイルの最初の出現ではなく、ファイルの各行の最初の出現を置き換えます。
David Dibben

1
さらに、これはGNU sed拡張機能であり、標準のsed機能ではありません。
ジョナサンレフラー

10
うーん...時間が経ちます。用POSIX 2008/2013 sed指定と置換コマンド:[2addr]s/BRE/replacement/flagsそのノート「フラグの値はゼロ以上でなければならない: N 。のみBREのn番目の発生の代替パターンの空間内に見出さ」したがって、少なくともPOSIX 2008では、末尾1はGNU sed拡張ではありません。確かに、でも中にSUS / POSIX 1997私は2008年にひどくラインバックの出ていたので、標準、これは、サポートされていた
ジョナサン・レフラー

7

可能な解決策:

    /#include/!{p;d;}
    i\
    #include "newfile.h"
    :a
    n
    ba

説明:

  • #includeが見つかるまで行を読み取り、これらの行を印刷してから新しいサイクルを開始します
  • 新しいインクルード行を挿入する
  • 行を読み取るだけのループに入ります(デフォルトでは、sedはこれらの行も出力します)。ここからスクリプトの最初の部分に戻ることはありません。

sed: file me4.sed line 4: ":" lacks a label
ロジャードパック

どうやら最近のsedバージョンで何かが変更され、空のラベルは許可されなくなりました。回答を更新
1

4

私はこれが古い投稿であることを知っていますが、以前使用していた解決策がありました:

grep -E -m 1 -n 'old' file | sed 's/:.*$//' - | sed 's/$/s\/old\/new\//' - | sed -f - file

基本的にgrepを使用して最初の出現箇所を出力し、そこで停止します。さらに行番号を印刷する5:line。それをsedにパイプし、:とその後のすべてを削除して、行番号だけを残します。これをsedにパイプして、末尾の番号にs /.*/ replaceを追加します。これにより、1行のスクリプトが最後のsedにパイプされ、ファイルのスクリプトとして実行されます。

したがって、regex = #includeおよびreplace = blahで、grepが最初に検出したものが5行目にある場合、最後のsedにパイプされたデータはになります5s/.*/blah/

最初のオカレンスが最初の行にある場合でも機能します。


私は、sと行番号以外の複数行のsedスクリプトまたはsedコマンドがまったく嫌いなので、このアプローチを採用しています。これが私のユースケースで使用したものです(bashで動作します)。filepath = / etc / hosts; patt = '^ \(127 \ .0 \ .0 \ .1。* \)'; repl = '\ 1 newhostalias'; sed $(IFS =:linearray =($(grep -E -m 1 -n "$ patt" "$ filepath"))&& echo $ {linearray [0]})s / "$ patt" / "$ repl" / "$ filepath"
パリティ3

できます。sed -f -いくつかはそうではないものを受け入れるのに十分賢いsedでのみですが、それを回避することができます:)
rogerdpack

3

すべての行で最初に出現する文字を置き換えるために誰かがここに来た場合(私のように)、これを使用します。

sed '/old/s/old/new/1' file

-bash-4.2$ cat file
123a456a789a
12a34a56
a12
-bash-4.2$ sed '/a/s/a/b/1' file
123b456a789a
12b34a56
b12

たとえば、1を2に変更すると、代わりに2番目のすべてのaのみを置き換えることができます。


2
これをすべて行う必要はありません。's/a/b/'つまりmatch ado just first match for every matching line
Samveen

私はサムビーンと一緒です。また、これはここで尋ねられた質問に答えません。この回答を削除することをお勧めします。
ソコウィ

質問は、「ファイルの最初の出現」ではなく「行の最初の出現」でした
Manuel Romeiro

3

GNU sedの-zオプションを使用すると、ファイル全体を1行だけであるかのように処理できます。そうs/…/…/すれば、ファイル全体の最初の一致のみが置き換えられます。覚えておいてください:s/…/…/各行の最初の一致のみを置き換え-zますが、オプションを使用sedすると、ファイル全体が1行として扱われます。

sed -z 's/#include/#include "newfile.h"\n#include'

一般的に、パターンスペースには1行だけでなくファイル全体が保持されるため、sed式を書き換える必要があります。いくつかの例:

  • s/text.*//として書き換えることができますs/text[^\n]*//。改行文字を除く[^\n]すべてに一致します。改行に到達するまで、すべてのシンボルと一致します。[^\n]*text
  • s/^text//として書き換えることができますs/(^|\n)text//
  • s/text$//として書き換えることができますs/text(\n|$)//

2

私はこれをawkスクリプトで行います:

BEGIN {i=0}
(i==0) && /#include/ {print "#include \"newfile.h\""; i=1}
{print $0}    
END {}

次に、awkで実行します。

awk -f awkscript headerfile.h > headerfilenew.h

ずさんな可能性があります、私はこれが初めてです。


2

別の提案として、edコマンドを確認することもできます。

man 1 ed

teststr='
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
'

# for in-place file editing use "ed -s file" and replace ",p" with "w"
# cf. http://wiki.bash-hackers.org/howto/edit-ed
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$teststr")
   H
   /# *include/i
   #include "newfile.h"
   .
   ,p
   q
EOF

2

最後に、RSSフィードの各アイテムに一意のタイムスタンプを挿入するために使用されるBashスクリプトでこれを機能させました。

        sed "1,/====RSSpermalink====/s/====RSSpermalink====/${nowms}/" \
            production-feed2.xml.tmp2 > production-feed2.xml.tmp.$counter

最初の出現のみを変更します。

${nowms}Perlスクリプトによって設定されたミリ秒単位の時間です。スクリプト$counter内のループ制御に使用されるカウンターであり\、コマンドを次の行に続けることができます。

ファイルが読み込まれ、stdoutが作業ファイルにリダイレクトされます。

私が理解している方法は1,/====RSSpermalink====/、範囲制限を設定して停止するタイミングをsedに伝え、次にs/====RSSpermalink====/${nowms}/、最初の文字列を2番目の文字列で置き換えるおなじみのsedコマンドです。

私の場合、コマンドを変数付きのBashスクリプトで使用しているため、コマンドを二重引用符で囲みます。


2

FreeBSD edを使用して、処理するファイルにステートメントedがない場合の「一致なし」エラーを回避しincludeます。

teststr='
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
'

# using FreeBSD ed
# to avoid ed's "no match" error, see
# *emphasized text*http://codesnippets.joyent.com/posts/show/11917 
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$teststr")
   H
   ,g/# *include/u\
   u\
   i\
   #include "newfile.h"\
   .
   ,p
   q
EOF

これはtimo回答と非常によく似ていますが、1年後に追加されました。
ジョナサンレフラー

2

これはあなたのために働くかもしれません(GNU sed):

sed -si '/#include/{s//& "newfile.h\n&/;:a;$!{n;ba}}' file1 file2 file....

またはメモリに問題がない場合:

sed -si ':a;$!{N;ba};s/#include/& "newfile.h\n&/' file1 file2 file...

0

次のコマンドは、ファイル内で最初に出現した文字列を削除します。空の行も削除します。xmlファイルで表示されますが、どのファイルでも機能します。

XMLファイルを使用していて、タグを削除したい場合に便利です。この例では、「isTag」タグの最初の出現を削除します。

コマンド:

sed -e 0,/'<isTag>false<\/isTag>'/{s/'<isTag>false<\/isTag>'//}  -e 's/ *$//' -e  '/^$/d'  source.txt > output.txt

ソースファイル(source.txt)

<xml>
    <testdata>
        <canUseUpdate>true</canUseUpdate>
        <isTag>false</isTag>
        <moduleLocations>
            <module>esa_jee6</module>
            <isTag>false</isTag>
        </moduleLocations>
        <node>
            <isTag>false</isTag>
        </node>
    </testdata>
</xml>

結果ファイル(output.txt)

<xml>
    <testdata>
        <canUseUpdate>true</canUseUpdate>
        <moduleLocations>
            <module>esa_jee6</module>
            <isTag>false</isTag>
        </moduleLocations>
        <node>
            <isTag>false</isTag>
        </node>
    </testdata>
</xml>

ps:Solaris SunOS 5.10(かなり古い)では動作しませんでしたが、Linux 2.6、sedバージョン4.1.5では動作します。


これは、以前の多くの回答と同じ基本的な考え方に非常によく似ていますが、GNUでしか機能しsedない(したがって、Solarisでは機能しなかった)ことと同じ警告があります。これは削除してください。回答してからすでに4年半前の質問には、独特の新しい情報はありません。確かに、実際に使用された例はありますが、質問にこれと同じくらい多くの回答がある場合は、議論の余地があります。
ジョナサンレフラー

0

新しいものはありませんが、おそらくもう少し具体的な答えがあります。 sed -rn '0,/foo(bar).*/ s%%\1%p'

例:次のxwininfo -name unity-launcherような出力を生成します。

xwininfo: Window id: 0x2200003 "unity-launcher"

  Absolute upper-left X:  -2980
  Absolute upper-left Y:  -198
  Relative upper-left X:  0
  Relative upper-left Y:  0
  Width: 2880
  Height: 98
  Depth: 24
  Visual: 0x21
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x20 (installed)
  Bit Gravity State: ForgetGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +-2980+-198  -2980+-198  -2980-1900  +-2980-1900
  -geometry 2880x98+-2980+-198

xwininfo -name unity-launcher|sed -rn '0,/^xwininfo: Window id: (0x[0-9a-fA-F]+).*/ s%%\1%p'生成したウィンドウIDの抽出:

0x2200003

0

POSIXly(sedでも有効)、1つの正規表現のみが使用され、(通常のように)1行だけのメモリが必要です。

sed '/\(#include\).*/!b;//{h;s//\1 "newfile.h"/;G};:1;n;b1'

説明:

sed '
/\(#include\).*/!b          # Only one regex used. On lines not matching
                            # the text  `#include` **yet**,
                            # branch to end, cause the default print. Re-start.
//{                         # On first line matching previous regex.
    h                       # hold the line.
    s//\1 "newfile.h"/      # append ` "newfile.h"` to the `#include` matched.
    G                       # append a newline.
  }                         # end of replacement.
:1                          # Once **one** replacement got done (the first match)
n                           # Loop continually reading a line each time
b1                          # and printing it by default.
'                           # end of sed script.

0

ユースケースはおそらく、発生がファイル全体に広がっていることですが、最初の10、20、または100行にのみ懸念があることがわかっています。

次に、OPの文言が最初にのみ考慮される場合でも、それらの行に対処するだけで問題が修正されます。

sed '1,10s/#include/#include "newfile.h"\n#include/'

0

ここで考えられる解決策は、ソースファイルでヘッダーを指定せずにヘッダーを含めるようコンパイラーに指示することです。GCCには次のオプションがあります。

   -include file
       Process file as if "#include "file"" appeared as the first line of
       the primary source file.  However, the first directory searched for
       file is the preprocessor's working directory instead of the
       directory containing the main source file.  If not found there, it
       is searched for in the remainder of the "#include "..."" search
       chain as normal.

       If multiple -include options are given, the files are included in
       the order they appear on the command line.

   -imacros file
       Exactly like -include, except that any output produced by scanning
       file is thrown away.  Macros it defines remain defined.  This
       allows you to acquire all the macros from a header without also
       processing its declarations.

       All files specified by -imacros are processed before all files
       specified by -include.

Microsoftのコンパイラには/ FIがあります(強制インクルード)オプションがあります。

この機能は、プラットフォーム構成などの一般的なヘッダーに便利です。LinuxカーネルのMakefileは-includeこれを使用します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.