2012-07-18 19 views
67

Bu konuda biraz yeniyim, benimle birlikte. Şu anda C# ve Java öğreniyorum ve benzerliklerinden biri, ana fonksiyonun bir sınıf içinde kapsanması gerektiğidir. Örneğin, programı çalıştırdığınızda ana genellikle "giriş noktası" olduğunu anlıyorum. Temel olarak, programınız ana işlevin bulunduğu her yerde çalışmaya başlayacaktır. Fakat her iki dilde de birden fazla sınıfta birden fazla ana fonksiyona sahip olabileceğine inanıyorum. Bu yüzden bir projeyi birden çok ana işlevle derlediğimde, "giriş noktası" nerede? Derleyici nereden başlayacağını nereden biliyor?Çoklu Ana İşlevler

+13

Her dil için cevap farklıdır. –

cevap

54

, sen derleme yaparken kullanmak istediğiniz ana yöntemini içeren sınıfı tanımlayabilirsiniz. Eğer bir kavanoza donatılacak eğer

http://msdn.microsoft.com/en-us/library/x3eht538.aspx

Java'da, sen küpünün manifest dosyanızda giriş noktası tanımlayabilir.

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

+9

Bu cevap için en çok oylanan şaşkınlık var. En azından Java için Code-Guru ve @CosmicComputer'ın yanıtları çoğu insan için daha alakalı görünüyor. Çok az "geliştirici" kavanozlar haricinde çok az geliştirici derim, manifesto yöntemini hiç kullanmam. –

+3

@GeorgeHawkins bana öyle görünüyor ki bu her iki dil için de soruya cevap veren tek cevaptır, ancak _Java_ için belki de en iyi cevap değildir. – 11684

57

Java'da, bilgisayar aslında programı çalıştırdığınızda, derleme değil "giriş noktası" belirler. MyClass içinde main() için Örneğin, komut satırı

java MyClass 

arar. Diğer tüm main() işlevleri göz ardı edilir.

IDE kullanıyorsanız, kullanmak istediğiniz main() işlevini içeren sınıfı ayarlayabilirsiniz. NET'te

+3

Java'da, 'public static void main (String [] args) 'ifadesini arar. –

+7

@LuiggiMendoza Evet, bu doğru. Kısacası, OP'nin zaten ne olduğunu bildiğini gösterdiği için main() için tam imzayı bıraktım. –

+5

Ya da bir yöntem imzası için 'public statik void main (String []) 'veya' public statik void main (String ...) 'olmak * çok * hassas. –

15

C#, birden Main yöntemleri kullanabilirsiniz.

Birden çok Main yöntemi varsa, derleyici hangi giriş noktasını kullanacağını bilmez ve dolayısıyla size bir hata gösterecektir.

Youspecify the Main method ihtiyacı derleme kullanılmak üzere: Visual Studio geliştirme ortamında veya csc derleyici sayesinde bir derleyici seçeneği olarak kullanılmak üzere hangi yöntemin belirtebilirsiniz.

+1

C# hakkında bilmiyorum, ancak Java'da bu yanlış. Java derleyici hangi giriş noktasının kullanılacağını umursamıyor; hepsini derler. Öte yandan, çalışma zamanı ortamının hangi giriş noktasını yürütmesi gerektiği söylenmelidir. –

+1

evet ... ama bu ans, C# değil java ile ilgili oldu – Anirudha

+2

@ Kod-Guru: Derleme zamanında derleme sırasında belirtilen bir giriş noktası olduğundan, yanıt C# için doğrudur - siz * bir sınıf adı belirtme * yürütme zamanında, sadece montaj adı. –

9

C# 'da, /main: derleyici seçeneğini kullanarak giriş noktasını belirtirsiniz. derlerken

namespace Application { 
    class ClassOne { 
     static void main() { 
      // Code here 
     } 
    } 

    class ClassTwo { 
     static void main() { 
      // Code here 
     } 
    } 
} 

sizin giriş noktası olarak ClassOne.main() kullanmak için aşağıdaki belirtmek istiyorum:

csc /main:Application.ClassOne hello.cs 
12

ana sınıfı özel sınıf olduğunu

iki main() fonksiyonlarını içeren aşağıdaki kodu düşünün sadece bir sebepten dolayı: Java Virtual Machine'i çalıştırdığınızda, bu fonksiyon JVM'nin yaptığı şeydir. Aslında diğer herhangi bir işlev gibidir ve aslında bir sınıfın ana işlevini başka bir sınıftan çağırabilirsiniz.,

java SomeClass 

ve SomeClass ana yöntem çalışır:

Birden sınıflarıyla bir proje derlemek

, bunu böyle kullanmak istediğiniz ana sınıfı ile çalışma sınıfına JVM anlatmak SomeClass'ın derlendiğini ve uygun derlenmiş dosyanın sınıf yolunuzda olduğunu varsayarak. (Bu sizin belirli bir işletim sisteminizle çalışmak zorunda kalacağınız bir şeydir, ama sanırım bir classpath belirtmek için -cp seçeneği için oldukça normaldir). Yani bu:

java -cp /home/MyName Someclass 

7

Java'da Diğerleri işaret gibi java komutu çalıştırdığınızda,, ana işlevi içeren sınıfını tanımlamak dizin/home/MyName içinde SomeClass ana fonksiyonu çalışacaktır .

Ayrıca, java -jar my.jar ile çalıştırılabilecek bir yürütülebilir jar oluşturabilirsiniz. Bu durumda, kavanozda META-INF klasöründe MANIFEST.MF adında bir bildirim dosyasına ihtiyacınız vardır. Bu dosyada, aşağıdaki ifadeyi kullanarak ana işlevi içeren sınıfı belirtirsiniz: Main-Class: YourClass. Visual Studio geliştirme ortamı

Açık projenin Özellikler sayfasında bu derleyici seçeneği belirlemek için

: Birden temel işlevleri giriş noktası için

4

ana yöntem statik, bu sınıfın yerine nesnesine ait anlamına gelir. Yani nesnenin içinde başka bir ana yöntemi olmayacak. Ana statik olduğu için ek bir ana yönteme sahip olmayacaktır. Yani sınıf başına bir kez. Eğer projenizde birden ana-yöntemleri varsa başvurunuzu Aslında

+0

Sadece açıklama için, bir sınıf * birden fazla ana yönteme sahip olabilir. Örneğin, 'public static void main() 've' public static void main (String []) 'olabilir. Java'da, çalışma zamanı ortamı, ikinci imzanın çalışmasını arar. –

2

başlatırken

, Linux'ta PE pencerelerinde formatı ve ELF biçimini, örneğin, ikili dosyada, başlatmak için hangisini belirtmek edecek veya herhangi başka bir sistemde, ikili dosya başlığı, başlangıç ​​adresi nerede belirlenir ve sadece bir tane olabilir.

Giriş noktası hangisi olmalıdır? Bağlayıcıya göre değişir. Tıpkı @SetFreeByTruth gibi komut satırı parametreleriyle belirtebileceğinizi söyledi. Birçok bağlayıcı, komut satırı parametreleriyle giriş noktasını belirtmeyi destekler. Örnek olarak, GNU en gld parametre -e ile giriş noktası belirtebilirsiniz.

Java sanal makinesi tarafından yüklendiği için Java'nın davranışını bilmiyorum.

-1

Visual Studio'da, giriş noktası olmak istediğiniz projeyi seçin, sağ tıklayıp Başlangıç ​​Projesi olarak ayarlayın.

+0

, "başlangıç ​​projesi" olacaktı, ama bu onların anlamı değil. Bir proje/montajda * birden fazla potansiyel giriş noktası * varsa, proje özelliklerini açar ve uygulama bölmesindeki "başlangıç ​​nesnesi" açılır listesinden seçim yaparsınız. – dlatikay