programing

함수 매개변수의 세미콜론

muds 2023. 10. 23. 22:09
반응형

함수 매개변수의 세미콜론

matrix_* matrix_insert_values(int n; double a[][n], int m, int n)
{
    matrix_* x = matrix_new(m, n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            x->v[i][j] = a[i][j];
    return x;
}

검사 행렬 예제

double in[][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
};

길을 좀 잃었어요, 뭐가 뭔지 모르겠어요.int n;제 주장 선언 안에 있습니다. C 위에서 작동하지만 C++는 이 구현을 허용하지 않습니다.저는 이 코드를 C++로 마이그레이션할 것이기 때문에 이것이 어떻게 작동하는지 알고 싶습니다.

이것은 VLA 선언자에 사용되는 매개 변수를 순방향 선언하는 데 사용되는 C99 GNU 확장(GCC 문서)에서 거의 사용되지 않는 기능입니다.

matrix_* matrix_insert_values(int n; double a[][n], int m, int n);

당신은 어떻게 하는 지 보입니까?int n두 번이나 나타나나요?첫번째int n;단지 실제의 선언일 뿐입니다.int n, 끝에 있는 거죠.앞에 나타나야 합니다.double a[][n]왜냐면n의 선언에 사용됩니다.a. 변수를 다시 조정하는 것이 괜찮으시다면, 당신은 그냥n전에a그러면 이 기능은 필요 없을 겁니다

matrix_* matrix_insert_values_rearranged(int m, int n, double a[][n]);

C++ 호환성 참고

분명히 말하면, GNU 확장은 함수 매개 변수의 순방향 선언일 뿐입니다.다음 프로토타입은 표준 C입니다.

// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);

이 코드는 C++에서 지원되지 않는 가변 길이 배열을 사용하므로 C++에서 이 함수를 호출할 수 없습니다.C++에서 호출할 수 있으려면 함수를 다시 작성해야 합니다.

C에서 항상 그렇게 부르는 경우(즉, 컴파일 시간에 n과 m이 고정된 경우), C++에서는 다음을 수행할 수 있습니다.

template <int N, int M>
void matrix_insert_values(const double (&a)[M][N]);

int main() {
  double in[5][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
  };

  matrix_insert_values(in);
};

템플릿 매개 변수로 N과 M이 있으며 함수에 전달된 입력에서 컴파일 시간에 자동으로 추론됩니다.

언급URL : https://stackoverflow.com/questions/15145524/semicolon-on-a-function-parameters

반응형