{ } 블럭이 의미가 있나요?

revizes의 이미지

어떤 코드를 보다 보니깐..

{
	uint8 i;
		
	for(i=0; i<MAX_EXTERNAL_DEVICE; i++)
			pThis->pIExternalDevice[i] = NULL;
}

이런식으로 블럭을 형성해 놓은게 있던데..
이렇게 하는 이유가 있을까요?

dasomoli의 이미지

C++ 이 아닌 C 코드라면 변수 선언 하려고 한게 아닌가 싶군요.

그리고 저렇게 하면 for 문 끝내고 i 변수가 죽-_-잖아요~ ㅋ



dasomoli의 블로그(http://dasomoli.org)
dasomoli = DasomOLI = Dasom + DOLI = 다솜돌이
다솜 = 사랑하옴의 옛 고어.
Developer! ubuntu-ko! 다솜돌이 정석
htna의 이미지

의미가 없지는 않습니다.
저의 경우에는 개념적인 블록을 나누기 위해
{ } 를 자주 사용합니다.
{ 앞에 설명을 붙이면서, 여기는 머머하는 부분이다..
음..
근데.. 저기는..
dasomoli님이 얘기한거 말고는 별 의미를 찾기 힘들군요..
전반적인 부분을 봐야 의미가 있는지 없는지 알 수 있겠지만...
^^;;;

WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra

j0nguk의 이미지

dasomoli님이 말씀하신 것 이외에는 다른 이유는 없어보입니다.

C99부터는 저럴 필요도 없어졌습니다만.

happycat의 이미지

가끔 쓰는 트릭인데..

첫째로 namespace를 분리하기 위해 사용할 수 있습니다. 저렇게 쓰면 저 안에서만 의미를 가지는 i를 선언할 수 있죠.

또한 int가 아닌 class등을 사용하면 저 scope에서만 사용되고 destruct되는 class를 사용할 수도 있습니다. 예를 들어 class가 mutex의 lock을 constructor에서 잡아주고 destructor에서 풀어주는 식으로 짰다면 그 클래스를 블럭 제일 앞에 local 변수로 선언해 줘도 되겠죠..

그런 정도 용도로 사용할 수 있겠습니다.

khris의 이미지

dasomoli님이 말하신 이유가 맞는듯 하네요.

단 for문의 첫번째에서 int i = 0 이라고 해줘도 되었을법한데...

───────────────────────
yaourt -S gothick elegant
khris'log

죠커의 이미지

Visual C++ 6's hack이기도 합니다. Visual C++ 6는 아래의 소스를 C++에서 사용할 때 scope가 제대로 되지 않습니다.

다른 이유라면 C99 이전의 C언어에서 scope를 제한 하기 위해서 이겠지요.

for(uint i=0; i<LGE_MAX_EXTERNAL_DEVICE; i++) 
    pThis->pIExternalDevice[i] = NULL; 
doldori의 이미지

CN wrote:
Visual C++ 6's hack이기도 합니다. Visual C++ 6는 아래의 소스를 C++에서 사용할 때 scope가 제대로 되지 않습니다.

아, 생각납니다. 예전에 이거 때문에 소스 고치느라고 삽질한 적 있는데...
으으... 갑자기 분노가... :evil:
zelon의 이미지

C 에서는 모르겠으나, C++ 에서는 생성자 소멸자를 통한 편한 lock 을 구현하기 쉽습니다.

예를 들자면, 생성자에서 a 를 받아서, a 에 lock 을 걸고, 소멸자에서 받아놓은 a 의 lock 을 푸는 클래스를 만든 후 scope 가 끝나면 지역 객체가 사라지는 것을 이용합니다.

class EZLock
{
public:
  EZLock(mutex lockobj)
 {
  m_lockobj = lockobj;
   lock(m_lockobj);
 }

 ~EZLock()
 {
  release(m_lockobj);
 }
 mutex m_lockobj;
}

와 같은 클래스를 쓴 후 다음처럼 lock 을 씁니다.

{
  EZLock(thisLock);

 for ( int i=0; i<100; ++i)
{
   if ( i == iWantValue) return;
}
}

간단히 생각나는 대로 짜봤는데 일반적인 락을 쓰면 return 을 할 때 release 를 해주고 나가는 등 신경(!) 을 써야하지만 저런 클래스를 하나 만들면 scope 를 나가면서 알아서 소멸자를 불러줘서 release 가 호출되죠.

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

kihongss의 이미지

revizes wrote:
어떤 코드를 보다 보니깐..

{
	uint8 i;
		
	for(i=0; i<LGE_MAX_EXTERNAL_DEVICE; i++)
			pThis->pIExternalDevice[i] = NULL;
}

이런식으로 블럭을 형성해 놓은게 있던데..
이렇게 하는 이유가 있을까요?

brew 코드군요. :D
함수중간에서 변수선언을 하기 위해 { ... }을 자주 쓰더군요.
ADS에서 C99를 지원하면 저렇게 안써도 될텐데...

chadr의 이미지

zelon wrote:
C 에서는 모르겠으나, C++ 에서는 생성자 소멸자를 통한 편한 lock 을 구현하기 쉽습니다.

예를 들자면, 생성자에서 a 를 받아서, a 에 lock 을 걸고, 소멸자에서 받아놓은 a 의 lock 을 푸는 클래스를 만든 후 scope 가 끝나면 지역 객체가 사라지는 것을 이용합니다.

class EZLock
{
public:
  EZLock(mutex lockobj)
 {
  m_lockobj = lockobj;
   lock(m_lockobj);
 }

 ~EZLock()
 {
  release(m_lockobj);
 }
 mutex m_lockobj;
}

와 같은 클래스를 쓴 후 다음처럼 lock 을 씁니다.

{
  EZLock(thisLock);

 for ( int i=0; i<100; ++i)
{
   if ( i == iWantValue) return;
}
}

간단히 생각나는 대로 짜봤는데 일반적인 락을 쓰면 return 을 할 때 release 를 해주고 나가는 등 신경(!) 을 써야하지만 저런 클래스를 하나 만들면 scope 를 나가면서 알아서 소멸자를 불러줘서 release 가 호출되죠.

오옷.. 그렇군요!! 좋은거 하나 배우고 갑니다 :)

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

죠커의 이미지

C++이라면 andrei의 scope guard도 괜찮더군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.