함수에 관한 다음 중 어떤 대답이 잘못 되었습니까?


17

그래서 긴 컴파일을 수행하는 동안 ODesk에서 C ++ 일반 테스트를하기로 결정 하고이 질문을 보았습니다.

이 질문

내가 실수하지 않으면, 그 단어 (또는 그 부족)가 주어지면이 모든 것이 사실 일 수 있습니다.

ㅏ.

int Foo() { }
int Foo(int bar) { }

비. 음, return void;의미 론적으로 잘못된 것입니다하지만 기능은 분명히있을 수 void반환 형식을.

void Foo() { }

씨. 이것은 인라인 함수의 정의입니다.

디. 다음 요소의 배치에 대해 자세히 설명하지 않고

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

또한 람다와 펑터를 사용하여 항상이 작업을 수행 할 수 있습니다.

이자형.

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

에프.

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

지.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

나는이 질문에 실제로 거짓 답 이 어디에 있는지 알지 못합니다 . 뭔가 빠졌습니까?

말할 것도없이 시간이 다되어서 전부 실패했습니다. 나는 나쁜 C ++ 프로그래머라고 생각합니다. :(


18
숙제를 붙인 아이에게 소리를 지르 러 왔습니다.
SomeKittens

실제로 모든 언어가 인라인 함수를 확장해야하는 것은 아닙니다. "인라인"은 Delphi의 명령이 아니라 컴파일러 힌트이며 C, C ++ 에는 예외가 있습니다. 따라서 "c"도 거짓 일 수 있습니다. 각 진술이 어떻게 잘못 될 수 있는지에 대한 답변을 작성하는 것이 더 재미있을 수 있습니다.
Móż April

1
@ Ӎσᶎ 텍스트 상자 만있는 경우. 돌아가서 "이 질문에 대한 문제보고"를 누르십시오.
Qix

5
그것은 함수의 배열이 아닙니다. 그것은 함수 포인터의 배열입니다.
user253751

@immibis 사실이지만 질문은 실제로 명확하지 않습니다 (적어도 나에게는 그렇지 않았습니다).
Qix

답변:


21

이 전체 질문은 피하다. 질문 문은 객관식 선택의 가능성을 암시하는 반면 단일 선택 단추는 단일 선택 사항을 나타냅니다.

또한 void 함수는 아무것도 반환하지 않기 때문에 b는 꽤 의심됩니다.

D는 또한 의문의 여지가 있습니다. 내가 아는 한 함수의 배열을 가질 수 없습니다. 물론, 함수 포인터 배열을 가질 수 있지만 정확히 같은 것은 아닙니다.


권리; D는 전화 할 수 있는지 묻는 것과 같습니다 int. 물론, 포인터로 캐스트하고 그 포인터가 함수를 참조한다면 ...
Qix

1
나는 그들이 D가 그들이 원하는 답이라고 내기하고 싶지만, 그렇습니다. 질문은 가난합니다.
로봇 고 르트

하지만 void기능은 어떤 반환하지 않는 값을 , 그들은 여전히 반환 유형을 void . 따라서 나는 B가 사실이라고 말합니다.
Thomas Eding

@ThomasEding 그것은 여전히 ​​나쁜 부분입니다. 당신은 return void;아니라 대신에 return;.
Qix

10

답 c)도 역시 거짓입니다.

"인라인 함수는 컴파일 오버 헤드 동안 확장되어 호출 오버 헤드를 방지합니다."

첫째, C ++ 컴파일러는 inline함수를 전혀 확장하지 않음 으로써 힌트 를 무시할 수 있습니다.

둘째, 확장을 수행하기 위해 언급 된 "이유"는 지나치게 단순화 된 것입니다. 실제로, 확장을 수행하거나 수행하지 않는 실제 이유는 전적으로 컴파일러 작성자의 손에 달려 있습니다.


당신은있는 거 올바른,하지만 난의 의미에 대해 생각했다 '그래, 컴파일러가 결정한 않는 함수 인라인 할' 보다는 inline힌트를.
Qix

컴파일러는 힌트를 완전히 무시할 수 없습니다. 최소한 강제적 인 효력이있어 ODR을 예외로합니다.
중복 제거기

@ 중복 제거기-예 가능합니다. "함수를 인라인으로 지정하는 방법에 관계없이 컴파일러는 무시하도록 요청합니다. 컴파일러는 인라인으로 지정된 함수를 호출하는 위치를 일부 또는 전부 또는 일부를 인라인 확장 할 수 있습니다." - 소스 isocpp.org/wiki/faq/Inline-Functions
스티븐 C

@StephenC : 인라인 확장 요청은 무시해도됩니다. 나는 ODR에 대한 명시적인 예외는 불가능하다고 말했다.
중복 제거기

내가 참조. 내 답변의 문구를 업데이트했습니다
Stephen C

7

씨. 이것은 인라인 함수의 정의입니다.

그것은 완전히 옳지 않습니다.
이름에도 불구하고 키워드 inline는 함수가 인라인 될 것이라고 보장하지 않습니다. 확신 할 수있는 유일한 것은 인라인 함수의 정의를 여러 번 볼 경우 컴파일러가 불평하지 않는다는 것입니다.

엄밀히 말하면, 옵션 C는 부정확하지만 퀴즈 작성자가 기대하는 대답이라고 생각하지 않습니다. 더 잘못된 답이 있기 때문입니다.

디. 다음 요소의 배치에 대해 자세히 설명하지 않고

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

또한 람다와 펑터를 사용하여 항상이 작업을 수행 할 수 있습니다.

귀하의 예에서는 함수 자체가 아닌 함수 functions대한 포인터 배열입니다. 마찬가지로 람다와 펑터도 실제로 기능하지 않습니다. 그것들은 함수 호출 연산자에 응답하는 클래스이지만 C ++ 언어 정의의 시각에서 기능하지는 않습니다.

C ++의 함수는 2 급 시민과 비슷합니다. 그것들을 정의하고 호출 할 수 있지만, 함수 타입으로 다른 것을 시도하자마자 (오류 배열을 만들면) 오류가 발생하거나 포인터로 자동 변환됩니다.


나는 D 비트에 동의하지만 키워드 자체에 c비해 이미 인라인 표시가 된 함수 로 읽었 inline습니다. 나는 inline힌트입니다 이해 합니다.
Qix

4

어떤 것이 든, b 이어야 합니다. 당신은 할 수 없습니다 ,하지만 당신은 반환 할 수 있습니다 . 컴파일러에게 반환 된 값이 없다는 것을 알리기 위해 함수 선언에 무효가되어야합니다.returnvoidnull

공허 유형

C와 C ++에서

void 결과 유형의 함수는 함수의 끝에 도달하거나 리턴 값없이 return 문을 실행하여 종료됩니다. void 유형은 함수가 인수를 취하지 않음을 나타 내기 위해 함수 프로토 타입의 유일한 인수로 나타날 수도 있습니다. 이름에도 불구하고, 이러한 모든 상황에서, 공극 유형은 단일 유형 인 실제 단위 유형과는 달리, 공극 유형은 0 또는 하위 유형이 아닌 단위 유형의 역할을하지만 공극 유형은 공란을 포함한다고합니다. 언어는 객체를 선언하거나 void 유형의 값을 나타내는 방법을 제공하지 않습니다.


2
-1 : void함수는 값을 반환하지 않지만 여전히 형식을 반환합니다 void. 따라서 나는 B가 사실이라고 말합니다.
Thomas Eding

경우에 따라 빈 공간 반환이 허용됩니다. 여기를 참조 하십시오 .
Josh Kelley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.