if 블록의 지역변수를 외부 블록에서 인식하게 하는 방법 없나요?

dltkddyd의 이미지

C++은 if도 하나의 지역으로 인식하는 것 같습니다. 다음의 소스를 컴파일하면, b라는 변수가 해당 범위에서 선언되지 않았다는 컴파일 에러 메시지가 출력됩니다.

#include <iostream>
using namespace std;

int main() {
int a=1;
if(a==1) {
int b=10;
}
cout<<b<<endl;
}

if 안의 b 변수를 외부에서 cout으로 출력할 방법이 없을까요?

qiiiiiiiip의 이미지

scope내에서 선언했으니, 당연히 해당 scope에서만 사용가능합니다.
밖에서도 사용하고 싶으면 밖에서 선언을 해야겠죠.

c++이라 그런게 아니라, c도 마찬가지입니다. 대부분의 언어가 그러할듯..

dgkim의 이미지

윗분말과 동일하게 제가 격어본 언어는 모두 변수의 영역이 있습니다.
함수로 가면 call by reference, call by value 등. 변수의 생존 영역을 잘 파악하는 것이 필요합니다.

ex. 다른 언어 예제. 자바 코드. 출력 결과는 "input"입니다. 설명하기가 그다지 쉽지 않았던 초보적인 문제. C나 C++와는 다르지만.

package some;
public class Scope {
    public static void main(String[] arg) {
        String a = "input";
        doJob(a);
        System.out.println("result : " + a);
    }
    public static void doJob(String a) {
        a = "output";
    }
}
sjpark의 이미지

/* filename: weird.cpp */
#include
#include
using namespace std;

int main(int argc, char *argv[])
{
int a = 1;
if (a == 1) {
int b;
b = atoi(argv[1]);
}

cout << *(&a + 1) << endl;
return 0;
}

/* compile
* g++ weird.cpp -o weird -Wall
*
* execute
* ./weird 10
*/

참고로.. 이런건 재미삼아 해보는 것이니.. 중요 한 곳에서 이런 짓 하시면..
몸과 정신이 많이 힘들어 지실 꺼에요;;

gilgil의 이미지

Programming Language에서 scope(변수 및 함수와 같은 ID가 어느 영역까지 영향을 미칠 수 있는가)의 종류는 크게 Lexical(Static) scoping과 Dynamic scoping이 있습니다. C/C++ Language는 Lexical scoping을 지원하는 언어로 보시면 됩니다.

gilgil의 이미지

C언어에서는 function의 제일 앞부분에서만 변수의 선언이 가능하고, function body 중간에서는 선언이 되지 못하는 것으로 알고 있습니다.

반면에 C++에서는 block(brace로 둘러 싼) 어느 곳에서도 변수의 선언이 가능합니다.

익명 사용자의 이미지

function의 앞부분이 아니라, block의 앞부분이죠..

익명 사용자의 이미지

순수 C 컴파일러에서 function 앞부분이 아닌 block 앞부분에서 variable 선언이 가능한가요?

익명 사용자의 이미지

익명 사용자의 이미지

순수 C 컴파일러에서 function 중간 부분에도 변수 선언이 가능합니다. 구닥다리 컴파일러만 쓰지 않는다면.

ymir의 이미지

ANSI C (ISO C90) 에서는 block 의 맨 첫 부분에서만 변수 선언이 가능하고..
C99 에서는 임의의 위치에서 변수 선언이 가능합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

gilgil의 이미지

root@ubuntu:~/temp# cat test.c
#include <stdio.h>
 
int main()
{
  printf("first\n");
  int i = 2;
  printf("second %d\n", i);
  return 0;
}
 
root@ubuntu:~/temp# gcc test.c
root@ubuntu:~/temp# ./a.out
first
second 2
root@ubuntu:~/temp# 

gcc version 4.4.5 임돠.

qiiiiiiiip의 이미지

gcc에서 임의 위치 선언이 되는 것은
gcc확장때문으로 알고 있습니다.

엄격한 표준에서는 허용하지 않습니다.
visual c 최근버전에서도 안됐던것으로 기억합니다.

$ gcc -pedantic test.c
test.c: In function 'main':
test.c:6:5: warning: ISO C90 forbids mixed declarations and code [-pedantic]

$ man gcc
...
       -pedantic
           Issue all the mandatory diagnostics listed in the C standard.  Some of
           them are left out by default, since they trigger frequently on harmless
           code.
익명 사용자의 이미지

비주얼 스튜디오의 C컴파일러는 구닥다리이기 때문이죠. 2010조차도. C99가 들어가있지 않아요.
gcc확장이 아니고 그냥 표준이에요.
http://en.wikipedia.org/wiki/C99

planetarium의 이미지

GPLv2가 여전히 많이 쓰이듯, 지나간 버전의 표준이라고 해서 표준이 아닌건 아닙니다.
"GCC에선 확장으로 미리 지원했었고 C99에서 정식으로 추가된 부분이다" 정도면 될것 같네요.

windowsprogrammer의 이미지

int _tmain(int argc, _TCHAR* argv[])
{
	auto closure = ([]() -> std::function<int()>
	{
		int x = 0;
		return [=]() mutable { return x++; };
	})();
 
	printf("%d\n", closure());
	printf("%d\n", closure());
	printf("%d\n", closure());
	return 0;
}

이건 어떤가요? 내부에서 선언된 non static 지역변수 x의 상태를 유지하며 바깥에서 사용합니다.

windowsprogrammer의 이미지

아, 물론 재미삼아 써본 것이고 질문에 대한 답이라는 뜻은 아닙니다^^

익명_사용자의 이미지

이건 무슨 언어죠?
c++같이 생긴것이...특이하네요.
lambda 함수를 지원하는듯한...

windowsprogrammer의 이미지

이 언어의 이름은 새로 태어난 C++입니다.
정식 명칭은 C++11 이죠.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.