<div><br></div> <div>아래 이미 답변이 나왔지만, </div> <div>반박 글도 나왔고 답변 해주신 분들이 언제 올지도 모르고 해서 </div> <div>정리하는 글을 올려볼까 합니다. </div> <div><br></div> <div>갓 스택오버플로우의 답변을 먼저 참고하시고, </div> <div><a target="_blank" href="http://stackoverflow.com/questions/13876868/void-mainvoid-vs-main" target="_blank">http://stackoverflow.com/questions/13876868/void-mainvoid-vs-main</a></div> <div><br></div> <div>갓스택오버플로우의 형님들의 답변에 따르면 <span style="font-size:9pt;line-height:1.5;">C99에서 void는 '없음'을 뜻합니다. </span></div> <div>따라서 이론상 C99에서 fn(void)는 인자가 없어야 됩니다. </div> <div>확인해보실까요? </div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><br><span style="color:#e8bf6a;">void </span><span style="color:#6a8759;">func(void) {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">blahblah = 1;<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">blahblah</span>++;<br>}<br><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">main() {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">func</span>(<span style="color:#6897bb;">152</span>);<br><span style="color:#e8bf6a;">return </span><span style="color:#6a8759;">0;<br></span>}</pre></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;background-color:#344134;">WhoAmI</span>$ <span style="color:#6a8759;">gcc -O0 -std=c99 argvoid.c -o argvoid<br></span><span style="color:#e8bf6a;">argvoid</span>.<span style="color:#9876aa;font-style:italic;">c</span><span style="color:#cc7832;">:</span><span style="color:#6897bb;">8</span>:<span style="color:#6897bb;">7</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">error</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">too </span><span style="color:#6a8759;">many arguments to function call, expected 0, have 1<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">func</span>(<span style="color:#6897bb;">152</span>);<br> ~~~~ <span style="color:#6a8759;">^~~<br></span><span style="color:#e8bf6a;">argvoid</span>.<span style="color:#9876aa;font-style:italic;">c</span><span style="color:#cc7832;">:</span><span style="color:#6897bb;">2</span>:<span style="color:#6897bb;">1</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">note</span><span style="color:#cc7832;">: </span><span style="color:#6a8759;">'func' declared here<br></span><span style="color:#e8bf6a;">void </span><span style="color:#6a8759;">func(void) {<br></span>^<br><span style="color:#6897bb;">1 </span><span style="color:#6a8759;">error generated.</span></pre></div> <div>두둥. 에러가 뜹니다. 이론대로 0개의 인자를 받아야하는 함수라고 에러메시지를 보여줍니다. </div> <div>그럼 아무것도 넣지 않은 경우는 어떨까요? </div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;background-color:#344134;">void</span><span style="color:#e8bf6a;"> </span><span style="color:#6a8759;">func() {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">blahblah = 1;<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">blahblah</span>++;<br>}<br><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">main() {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">func</span>(<span style="color:#6897bb;">153</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">154</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">155</span>);<br><span style="color:#e8bf6a;">return </span><span style="color:#6a8759;">0;<br></span>}</pre></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;">WhoAmI</span>$ <span style="color:#6a8759;">gcc -O0 -std=c99 argnothing.c -o argnothing<br></span><span style="color:#e8bf6a;">argnothing</span>.<span style="color:#9876aa;font-style:italic;">c</span><span style="color:#cc7832;">:</span><span style="color:#6897bb;">8</span>:<span style="color:#6897bb;">20</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">warning</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">too </span><span style="color:#6a8759;">many arguments in call to 'func'<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">func</span>(<span style="color:#6897bb;">153</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">154</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">155</span>);<br> ~~~~ <span style="color:#6a8759;">^<br></span><span style="color:#6897bb;">1 </span><span style="color:#6a8759;">warning generated.</span></pre></div> <div>경고만 줍니다. </div> <div>에러를 내뿜어야 당연한게 아닌가 하는 생각이 들지만, <span style="font-size:9pt;line-height:1.5;">이것은 컴파일러가 컴파일하는 규칙에 의한 결과물이므로 그냥 넘어가겠습니다. </span><span style="font-size:9pt;line-height:1.5;">사실 이렇게 사용하는 사람도 없잖아요? 해당 결과는 컴파일러마다 다를 수 있습니다. 다른 분이 올린 것처럼 vc는 해당 표준을 구현하지 않았거나 무시할 수도 있습니다. </span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">그럼 이번에는 원래 질문인 main()과 main(void)가 차이가 있는지 없는지를 한번 살펴보도록 하죠. </span></div> <div>앞선 결과를 보면 main(void)는 어떤 인자도 받아들이지 않겠다고 명시적으로 선언했습니다. </div> <div><br></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">main() {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">a = 152 + 312;<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;background-color:#344134;">return</span><span style="color:#e8bf6a;"> </span><span style="color:#6a8759;">0;<br></span>}</pre></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">main(void) {<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">int </span><span style="color:#6a8759;">a = 152 + 312;<br></span><span style="color:#6a8759;"> </span><span style="color:#e8bf6a;">return </span><span style="color:#6a8759;">0;<br></span>}</pre></div> <div>컴파일 결과 둘다 에러는 발생하지 않습니다.</div> <div><span style="font-size:9pt;line-height:1.5;">컴파일 결과물도 동일합니다. 확인해보시죠. </span></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;"><span style="color:#e8bf6a;">emptymain</span>`<span style="color:#e8bf6a;">main</span><span style="color:#cc7832;">:<br></span>-> <span style="color:#6897bb;">0x100000f80</span>: pushq %rbp<br><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f81</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movq </span><span style="color:#6a8759;">%rsp, %rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f84</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, %eax<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f89</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, -0x4(%rbp)<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f90</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x1d0, -0x8(%rbp)<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f97</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">popq </span><span style="color:#6a8759;">%rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f98</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">retq<br></span><span style="color:#e8bf6a;"><br></span><span style="color:#e8bf6a;">voidmain</span>`<span style="color:#e8bf6a;">main</span><span style="color:#cc7832;">:<br></span>-> <span style="color:#6897bb;">0x100000f80</span>: pushq %rbp<br><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f81</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movq </span><span style="color:#6a8759;">%rsp, %rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f84</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, %eax<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f89</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, -0x4(%rbp)<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f90</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x1d0, -0x8(%rbp)<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f97</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">popq </span><span style="color:#6a8759;">%rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f98</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">retq<br></span></pre></div> <div>그럼 main()하고 main(void)를 호출하는 녀석은 어떻게 생각하고 있을까요? </div> <div><br></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;">(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">bt<br></span>* <span style="color:#6a8759;">thread #1: tid = 0x44e6e, 0x0000000100000f80 emptymain`main, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1<br></span>* <span style="color:#6a8759;">frame #0: 0x0000000100000f80 emptymain`main<br></span><span style="color:#e8bf6a;">frame </span><span style="color:#6a8759;">#1: 0x00007fff98dd35c9 libdyld.dylib`start + 1</span></pre></div> <div>Mac에서는 libdyld.dylib의 start에서 main함수를 호출합니다. </div> <div><br></div> <div><pre style="color:#a9b7c6;font-family:Menlo;font-size:12pt;background-color:#2b2b2b;">(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">r 'testempty'<br></span><span style="color:#e8bf6a;">Process </span><span style="color:#6a8759;">33860 launched: '/Users/WhoAmI/llvm/emptymain' (x86_64)<br></span><span style="color:#e8bf6a;">Process </span><span style="color:#6a8759;">33860 stopped<br></span>* <span style="color:#6a8759;">thread #1: tid = 0x4764c, 0x0000000100000f80 emptymain`main, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1<br></span><span style="color:#e8bf6a;">frame </span><span style="color:#6a8759;">#0: 0x0000000100000f80 emptymain`main<br></span><span style="color:#e8bf6a;">emptymain</span>`<span style="color:#e8bf6a;">main</span><span style="color:#cc7832;">:<br></span>-> <span style="color:#6897bb;">0x100000f80</span>: pushq %rbp<br><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f81</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movq </span><span style="color:#6a8759;">%rsp, %rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f84</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, %eax<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f89</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, -0x4(%rbp)<br></span>(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">x/12xw $rsp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbb8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x98dd35c9 </span><span style="color:#6a8759;">0x00007fff 0x98dd35c9 0x00007fff<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbc8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x00000000 </span><span style="color:#6a8759;">0x00000000 0x00000002 0x00000000<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbd8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x5fbffce0 </span><span style="color:#6a8759;">0x00007fff 0x5fbffcfd 0x00007fff<br></span>(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">x/s 0x7fff5fbffcfd<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffcfd</span><span style="color:#cc7832;">: </span><span style="color:#6a8759;">"testempty"<br></span><span style="color:#6a8759;"><br></span>(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">r 'testvoid'<br></span><span style="color:#e8bf6a;">Process </span><span style="color:#6a8759;">33865 launched: '/Users/WhoAmI/llvm/voidmain' (x86_64)<br></span><span style="color:#e8bf6a;">Process </span><span style="color:#6a8759;">33865 stopped<br></span>* <span style="color:#6a8759;">thread #1: tid = 0x47677, 0x0000000100000f80 voidmain`main, queue = 'com.apple.main-thread', stop reason = breakpoint 3.1<br></span><span style="color:#e8bf6a;">frame </span><span style="color:#6a8759;">#0: 0x0000000100000f80 voidmain`main<br></span><span style="color:#e8bf6a;">voidmain</span>`<span style="color:#e8bf6a;">main</span><span style="color:#cc7832;">:<br></span>-> <span style="color:#6897bb;">0x100000f80</span>: pushq %rbp<br><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f81</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movq </span><span style="color:#6a8759;">%rsp, %rbp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f84</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, %eax<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x100000f89</span><span style="color:#cc7832;">: </span><span style="color:#e8bf6a;">movl </span><span style="color:#6a8759;">$0x0, -0x4(%rbp)<br></span>(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">x/12xw $rsp<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbc8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x98dd35c9 </span><span style="color:#6a8759;">0x00007fff 0x00000000 0x00000000<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbd8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x00000002 </span><span style="color:#6a8759;">0x00000000 0x5fbffce8 0x00007fff<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffbe8</span><span style="color:#cc7832;">: </span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x5fbffd04 </span><span style="color:#6a8759;">0x00007fff 0x00000000 0x00000000<br></span>(<span style="color:#bababa;">lldb</span>) <span style="color:#6a8759;">x/s 0x7fff5fbffd04<br></span><span style="color:#6897bb;">0</span><span style="color:#e8bf6a;">x7fff5fbffd04</span><span style="color:#cc7832;">: </span><span style="color:#6a8759;">"testvoid"</span></pre></div> <div><br></div> <div><span style="font-size:9pt;line-height:1.5;">프로세스를 만들어 main함수를 호출하는 과정에서 </span></div> <div>main()으로 선언했든 main(void)로 선언했든 int argc, char* argv를 인자로 넘겨주는 것을 확인할 수 있습니다. </div> <div><br></div> <div>고로 컴파일하는 것은 불가능 하더라도, main()이나 main(void)에 인자를 넘겨주는 것은 재량입니다. </div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">결론, </span></div> <div><span style="font-size:9pt;line-height:1.5;">main() 와 main(void)는 차이가 없습니다.</span></div> <div><span style="font-size:9pt;line-height:1.5;">fn()과 fn(void)는 컴파일러에 따라 인자를 넘기면 에러 혹은 경고를 냅니다. </span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><br></div> <div><br></div>
<img src="http://thimg.todayhumor.co.kr/upfile/201211/149cb18245dee8e5db8cdbe2400e4147.png" alt="149cb18245dee8e5db8cdbe2400e4147.png">
이 게시물을 추천한 분들의 목록입니다.
[1] 2015/03/10 10:44:19 202.150.***.24 러브의맛
342577[2] 2015/03/10 12:08:14 211.186.***.102 용밤스
374904[3] 2015/03/10 12:50:16 123.212.***.153 슝슝3
284767[4] 2015/03/10 13:31:09 210.94.***.63 근육실종녀
432701[5] 2015/03/10 15:07:09 1.253.***.134 우헤헤헤헤
137160[6] 2015/03/10 15:10:27 165.132.***.34 통닭실종사건
501972[7] 2015/03/10 19:41:38 223.62.***.119 REGENTAG
141650[8] 2015/03/11 11:47:47 61.255.***.213 Cameo
251208[9] 2015/03/13 02:41:51 118.41.***.83 자켄
542809[10] 2015/03/19 15:27:21 168.188.***.88 쿠로바라
105945
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.