• 締切済み

Cコンパイラのオプションに関して教えて下さい。

あるシステムでSolaris版Workshop5.0又はForteCにおいて-DMAINと-DSVR4というオプションがコンパイルオプションで指定されています。マニュアルを見て-Dオプション自体は#defineへの指定と解釈したのですが、どうもMAINとSVR4という指定に特別な意味があるような気がして質問しました。ご存知の方がいらっしゃいましたら教えて頂けないでしょうか?

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

-DMAINの方は,Makefileなりソースなりを見ないとわかりませんが、 -DSVR4は通常OSがSVR4系であることを示すために使います。 システムコール、ライブラリ等の違いがあるので、 プログラムがSVR4が持つ物を使うようにするために指定します。 SVR4はSystem V Release 4の意味で, unixはBSD系とSystem V系大別されます。

関連するQ&A

  • Solaris10でCコンパイラが見つからない?

    Solaris 10 1/06 X86版にphp5.1.2をインストールしようとしているのですが、下記エラーが表示されてコンパイルが終了してしまいます。 エラー内容を見るとCコンパイラが見つからないといっているようなのですが、どう対応すればいいのでしょうか・・・ Solaris10にはgccコンパイラがインストールされていると思うのですが・・・ どなたかよろしくおねがいします。 # ./configure loading cache ./config.cache checking for Cygwin environment... no checking for mingw32 environment... no checking for egrep... egrep checking for a sed that does not truncate output... /usr/bin/sed checking host system type... i386-pc-solaris2.10 checking target system type... i386-pc-solaris2.10 checking for gcc... no checking for cc... no configure: error: no acceptable cc found in $PATH

  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

  • フォルダオプションの設定

    フォルダオプションで隠しフォルダとファイルの表示ができますが システム一括ではなく“指定したドライブ”のみに適応する方法はありますか? たとえばDドライブのみに設定して、ほかのドライブは非表示のままとかです。

  • C#のコマンドラインの分割コンパイルと実行について

    コマンドラインでC#のプログラムをコンパイルと実行する方法 mainが1つでsubが1の場合は以下にある。 http://d.hatena.ne.jp/taka_2/20080124/p6 mainが1つでsubが2つの場合はコマンドはどうするか。 以下に使用したコマンドを示す csc /target:library sub1.cs csc /target:library sub2.cs csc /R:sub1.dll /R:sub2.dll main1.cs とすると error CS0246: 型または名前空間名 'sub1' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 のエラーメッセージが表示される。 わかっている方がおりましたら、教えて下さい。 以下にプログラムを示す。 //---------------------------------------------------------------------------- // mainファイルの内容 using System ; using System.Text; using System.IO; using sub1 ; // subの名前空間を指定(分割コンパイル用) using sub2 ; // subの名前空間を指定(分割コンパイル用) namespace main1 { class Program { static void Main(string[] args) { int a = 10 ; int b = 5 ; sub1.dfsub_cs1 df1 = new sub1.dfsub_cs1() ; // sub1のクラスを確保(分割コンパイル用) sub2.dfsub_cs2 df2 = new sub2.dfsub_cs2() ; // sub2のクラスを確保(分割コンパイル用) Console.Write("add {0,3:D} * {1,3:D} = {2,5:D}\n", a,b, df1.multiply( a, b) ); Console.Write("add {0,3:D} / {1,3:D} = {2,5:D}\n", a,b, df2.divide( a, b) ); return ; } } } //---------------------------------------------------------------------------- // sub1ファイルの内容 namespace sub1 { public class dfsub_cs1 { public int multiply(int a, int b ) { return a * b ; } } } //---------------------------------------------------------------------------- // sub2ファイルの内容 namespace sub2 { public class dfsub_cs2 { public int divide(int a, int b ) { return a / b ; } } }

  • C#でコンパイルができない。

    C#のベータ版をセットアップして以下のサンプルプログラムを コンパイルしたところ、エラーがでました。何がいけないのでしょうか?OSはWin98です。 css001.cs(7,3): error CS0117: 'System.Console' does not contain a definition for 'Writeline' using System; プログラムリスト public class CSS001 { public static void Main(string[] args) { Console.Writeline("Hello World"); } }

  • C言語の意味

    プログラミングの勉強をしています。 知り合いから,アルファベットの大文字を小文字に変換するプログラムについておしえてもらいました。 #include<stdio.h> #include<ctype.h> #define MCH 3 int main() { char chs[MCH]; printf("アルファベットの大文字を入力して下さい:"); fgets(chs,MCH,stdin); chs[1] = '\0'; printf("小文字は[%c]です。\n",tolower(*chs)); return 0; } この中で, 3行目の#define MCH 3 のdefineの意味 6行目のchar chs[MCH]; のchs・MCHの意味 9行目のchs[1]= '\0'; これ自体の設定がわかりません。 教えてもらえないでしょうか?

  • Cプログラミングについて

    私はBorlandのコンパイラを使ってCプログラミングをやっているのですが、以下のプログラムが実行できません。 どのようにすればコンパイラできるのか教えてください。 非線型方程式f(x)=x^3-x+1の根をニュートン法により求めよ。 /* *-------------------------- *   ニュートン法 * *-------------------------- */ #include <stdio.h> #include <math.h> #define f(x) ((x)*(x)*(x)-(x)+1) #define g(x) (3*(x)*(x)-1) #define EPS 1e-8 #define LIMIT 50 int main(void) { double x=-2.0,dx;   int k; for (k=1;k<=LIMIT;k++){ dx=x; x=x-f(x)/g(x); if(fabs(x-dx)<fabs(dx)*EPS){ printf("iteration=%d\n",k); printf("x=%f\n",x); break; } } if (k>LIMIT) printf("収束しない\n"); } コンパイルしようとすると以下のようなエラーが出ます。 エラー E2206 sample.c 18: 不正な文字 ' ' (0x8140)(関数 main ) エラー E2206 sample.c 18: 不正な文字 ' ' (0x8140)(関数 main ) 警告 W8070 sample.c 32: 関数は値を返すべき(関数 main ) *** 2 errors in Compile *** お答えよろしくお願いします。

  • CおよびC++におけるtypedefの厳密な扱われ方

    お世話になっております。 主に3D系のゲームプログラマをしている者です。 今更こんな基本的な事を聞くのもお恥ずかしいのですが、出来るだけ正確な確認をしたいので、 皆様のお力を借りれたらと思います。 知りたい部分は、typedefで型再定義された物は、 元の型と全く同じ型として扱われると思って問題ないのか。 と言う事です。 typedefは、型の同義語を作る。 とあり、型名を簡略化する目的で使用されるのが一般的な使われ方ですが、型の同義語。 と言うのは、完全に、同じ型ではあるが名前だけが違う。と言う別名定義(defineの如く)として 見て良いのでしょうか? 例えば、 typedef int INT_A; void func (int param); /* 通常のintで仮引数を取る */ int main(void) {  INT_A num = 0; /* 再定義したINT_Aで変数を宣言し */  func(num); /* 通常intの仮引数にINT_Aで引数を渡す */  return 0; } 等とした場合、問題ないでしょうか。 特に問題ない事は幾つかの処理系で確認していますし、自身問題ないだろうと思っていますが、 厳密に言えば推測の域を出ないので困っています。 参考書やネット、経験からの勝手な推測では、defineならプリプロセッサにより、 コンパイル前にテキストレベルでの置き換えが行われるので同一。 typedefはコンパイル時解釈とあるので、同じ型と解釈して、 オブジェクトファイル等のバイナリレベルに落とす際に同一物にしてしまう。 等の変換を処理系で行っているのなら、同一なのかな。等と思っています。 (私は処理系の開発等はした事がありませんし、知識もソフ開レベル程度があるだけです) また、上記コードはC/C++どちらでも適用出来ますが、 C++はCと比べ、型の違いをより厳密に見ると聞きます。 ネットや参考書、経験則と言った類からの意見ですと質問した意味が ありませんので、 なるべくなら、X3010および、X3014(ANSIやISOも可)の規格から見て、上記の様な コードが全く問題ないのかどうか、ご教示頂けると幸いです。 (私は規格を持っていませんので・・・) また、上の例はサンプルであり、使い方等におけるコードの 可読性や意義に関しては、ここでは別問題とします。 以上、宜しくお願いします。

  • javacコマンドの<-d>オプションについて

    現在ojc-p(旧sjc-p)の資格取得に向けて勉強をしています。 javacコマンドの<-d>オプションに関して、以下のような問題があり、回答に納得がいかないため、ご教授頂きたいと思います。 -----------以下、問題----------- カレントディレクトリをprojectとしたときに、Fooクラスを以下のコマンドでコンパイルした。この時の説明として正しいものを選びなさい。 【ディレクトリ階層】 project  └src    └Foo.java 【実行コマンド】 javac -d build src/Foo.java 【ソースコード】 1. package x.y.z; 2. 3. public class Foo{ 4.   // more code here 5. } 【選択肢】 A) buildディレクトリが存在していないため、コンパイルエラーになる B) projectディレクトリいかにbuild/Foo.classファイルが作成される C) projectディレクトリ以下にbuild/x/y/zFoo.classファイルが作成される D) srcディレクトリいかにbuild/Foo.classファイルが作成される E) srcディレクトリ以下にbuild/x/y/z/Foo.classファイルが作成される -----------ここまで----------- 自分の考えでは、-dに指定されたbuildディレクトリが存在していないためコンパイルが通らない、つまり、回答はAであると考えていたのですが、実際の回答は「C」でした。 同問題の解説を見ると、「-dオプションで引数に指定したディレクトリが存在しない場合には、自動的にそのディレクトリを作成します」とあります。 自分の環境では、-dオプションの引数に存在しないディレクトリ名を指定すると、いくらやっても「ディレクトリがありません」と表示されてしまいます。 -dオプションで存在しないディレクトリが作成されるには、何かしらの条件が必要なのでしょうか。

    • ベストアンサー
    • Java
  • Option Explictについて教えてください

    WEBでOption Explictを検索したら ------------------------------------ option explicit を指定して実行すると、 「コンパイルエラー変数が定義されていません。」 のエラーが出て、青色に反転します。 つまり、単純ミスが防げます。 option explicit が無いと ミスがミスと分からずに実行しますので、 間違った結果が出てしまいます。 option explicit は無条件に定義しましょう。 ---------------------------------- 変数の宣言を強制されるため、 変数のタイプミスを防ぐことができます。 ---------------------------------- 初心者はVBEの「ツール」の「オプション」 「編集」を選択して「変数の宣言を強制する」 (初期状態ではチェックがついていません) には必ずチェック。 ------------------------------------ 変数を宣言しているのはユーザーの環境が、 Option Explicit と明示的に変数を宣言することを 要求されている可能性があるので「エラーが出ました」 という場合があるからです --------------------------------- など色々と見つかりました。 一番わかりやすかったのは ↓これでした。 http://okwave.jp/qa/q4304440.html また以下のような説明もありました。 Option Explicitをつけた場合とつけない場合で 下のソースを実行してみてください。 abc = "Hello" Msgbox(adc) ↓ で説明のように試してみたら ・つけた場合→コンパイルエラー ・つけない場合→エラーにならずMsgboxは空白 でした。これは理解できました。 ですが以下の場合 Option Explicit Sub Macro1() Sheets("Sheet1").Select Columns("A:A").Select Selection.Copy Columns("C:C").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A1").Select End Sub 多分変数は宣言していないので 「変数が定義されていません」とエラーが出ると 思ったのに、でませんでした。 >変数の宣言を強制されるため >Option Explicit と明示的に変数を宣言することを >要求されている可能性 の説明からの自分の解釈と合致しません。 option explicitを指定すると 【記述内に変数宣言がないとエラーになる】 と解釈したのですがそれは間違っていますか? それともSub Macro1()はどこかに変数宣言が あるのでしょうか? 凄くわかりやすく教えていただきたいです。 【追記】 退職者が残したエクセルファイルにて。 Sheet1~Sheet8まであります。 VBEで見ていくと Sheet1:Option Explict  Sheet2:Option Explict  Sheet3:Option Explict  Sheet4:Option Explict  Sheet5:Option Explict  Sheet6:何も無し Sheet7:Option Explict  Sheet8:Option Explict  次に標準モジュールを見ると Module1:Option Explict Sub Macro2() Module2:Option Explict Sub Macro3()  Module3:Option Explict Sub Macro4() Module4:Option Explict Sub Macro5()  Module5:Option Explict  Module6:Option Explict Sub Macro1() となっています。 Macro1~Macro5は全て マクロの記録のみで作成されています。 これを修正するのですが、Option Explictを 初めて見たので困惑しています。 よろしくお願いします。

専門家に質問してみよう