source

C에서 다중 정의를 방지하려면 어떻게 해야 합니까?

factcode 2022. 8. 29. 22:05
반응형

C에서 다중 정의를 방지하려면 어떻게 해야 합니까?

저는 C 초보자이고, Code::로 콘솔 어플리케이션을 작성하려고 했습니다.블록. (간소화된) 코드는 다음과 같습니다: main.c:

#include <stdio.h>
#include <stdlib.h>
#include "test.c" // include not necessary for error in Code::Blocks

int main()
{
    //t = test(); // calling of method also not necessary
    return 0;
}

test.c:

void test() {}

이 프로그램을 빌드하려고 하면 다음 오류가 발생합니다.

*path*\test.c|1|'_test'의 정의 표시|obj\Debug\main.o:*path*\test.c|1|여기서 처음 정의|

(밑줄의 출처는 알 수 없지만) 다중 정의 테스트는 할 수 없습니다.정의가 두 번 포함되어 있을 가능성은 매우 낮습니다.여기 있는 암호는 이것뿐입니다.

이 오류는 test 또는 test.c라고 하는 다른 함수 또는 파일과의 이름 경합에 의한 것이라고는 할 수 없습니다.여러 정의와 첫 번째 정의는 동일한 파일에서 같은 줄에 있습니다.

이 문제의 원인과 제가 할 수 있는 일을 아는 사람이 있습니까?감사합니다!

.test.c 2회:

  • 컴파일 할test.c 자체 그 자체,
  • main.c 명령어에는 이 포함되어 있습니다.test.c★★★★★★ 。

★★★★에 필요한 것main.ctest()함수는 단순한 선언이며 그 정의가 아닙니다.은 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아test.h헤더 파일에는 다음과 같은 것이 포함되어 있습니다.

void test(void);

이를 통해 컴파일러는 입력 파라미터와 반환유형을 가진 함수가 존재함을 알립니다.내부 것){ ★★★★★★★★★★★★★★★★★」}은(는) 에 .test.cfilename을 클릭합니다.

main에서 main을 합니다.c's c's c's c's understand's c#include "test.c"타타에 #include "test.h".

마지막으로 프로그램이 복잡해짐에 따라 헤더 파일이 여러 번 포함될 수 있는 상황에 직면하게 됩니다.이를 방지하기 위해 헤더소스는 다음과 같은 특정 매크로 정의로 둘러싸일 수 있습니다.

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED

void test(void);

#endif

언더스코어는 컴파일러에 의해 삽입되어 링커에 의해 사용됩니다.기본 경로는 다음과 같습니다.

main.c
test.h ---> [compiler] ---> main.o --+
                                     |
test.c ---> [compiler] ---> test.o --+--> [linker] ---> main.exe

따라서 메인 프로그램에는 테스트 모듈의 헤더 파일이 포함되어 있어야 합니다.이 파일은 다음과 같은 함수 프로토타입과 같은 선언으로만 구성되어야 합니다.

void test(void);

이를 통해 컴파일러는 main.c가 컴파일 중이지만 실제 코드가 test.c, test.o에 있을 때 존재하는 것을 알 수 있습니다.

이것은 두 모듈을 결합하는 연결 단계입니다.

test.c를 main.c에 포함시킴으로써 main.o에서 test() 함수를 정의합니다.아마 main.o와 test.o를 링크하고 있을 것입니다.둘 다 함수 test()를 포함하고 있습니다.

Ages after this I found another problem that causes the same error and did not find the answer anywhere. I thought to put it here for reference to other people experiencing the same problem.

I defined a function in a header file and it kept throwing this error. (I know it is not the right way, but I thought I would quickly test it that way.)

The solution was to ONLY put a declaration in the header file and the definition in the cpp file.

The reason is that header files are not compiled, they only provide definitions.

You shouldn't include other source files (*.c) in .c files. I think you want to have a header (.h) file with the DECLARATION of test function, and have it's DEFINITION in a separate .c file.

The error is caused by multiple definitions of the test function (one in test.c and other in main.c)

I had similar problem and i solved it following way.

Solve as follows:

Function prototype declarations and global variable should be in test.h file and you can not initialize global variable in header file.

Function definition and use of global variable in test.c file

if you initialize global variables in header it will have following error

multiple definition of `_ test'| obj\Debug\main.o:path\test.c|1|first defined here|

Just declarations of global variables in Header file no initialization should work.

Hope it helps

Cheers

구현 파일 포함(test.c)를 지정하면 main.c에 추가되어 거기에 준거한 후 다시 개별적으로 준거합니다.그래서 그 함수는test2개의 정의가 있습니다.하나는 오브젝트코드에 있습니다.main.c그리고 그 중 한 번test.cODR 위반이 발생합니다.다음 선언을 포함하는 헤더 파일을 생성해야 합니다.test에 포함시키다main.c:

/* test.h */
#ifndef TEST_H
#define TEST_H
void test(); /* declaration */
#endif /* TEST_H */

If you have added test.c to your Code::Blocks project, the definition will be seen twice - once via the #include and once by the linker. You need to:

  • remove the #include "test.c"
  • create a file test.h which contains the declaration: void test();
  • include the file test.h in main.c

If you're using Visual Studio you could also do "#pragma once" at the top of the headerfile to achieve the same thing as the "#ifndef ..."-wrapping. Some other compilers probably support it as well .. .. However, don't do this :D Stick with the #ifndef-wrapping to achieve cross-compiler compatibility. I just wanted to let you know that you could also do #pragma once, since you'll probably meet this statement quite a bit when reading other peoples code.

행운을 빈다

언급URL : https://stackoverflow.com/questions/672734/how-to-prevent-multiple-definitions-in-c

반응형