2014-08-27 3 views
14

이 코드는 gcc -g -o main main.c으로 컴파일 할 수 있으며 경고는 표시되지 않습니다.C 언어 : 연산자 "#"의 의미?

// main.c 
# 41 "stdio.h" 
# 22 
# 
int main(void){ 
    (void)printf("foo"); 
    return 0; 
} 

내 질문은 :

전에 운영자 "#"의 의미를 무엇
  1. 은 "포함". 우리는 #include <stdio.h>을 사용하여 헤더 파일을 포함합니다. 왜 include <stdio.h>입니까?

  2. # 22 또는 # 41을 컴파일 할 수있는 이유는 이전에 본 적이 없었습니다.

아무도 도와 줄 수 있습니까?

+4

http://stackoverflow.com/questions/7110683/what-is-the-use-of-in-c-or-c 확인이 형제 –

+1

@mkpchiran에서 촬영 : 귀하의 링크는 위의 문제를 설명하지 않습니다. – deepmax

답변

8

이것은 전처리 기의 출력과 같습니다.

  • 41의 의미를 갖는다 : 광고

    # 41 "stdio.h" 
    

    처럼 해석 될 수

그것은 입력의 다음 행에 대해보고한다 행 번호를 지정한다. 후속 라인은 linenum에서부터 계산됩니다.

  • "stdio.h"는 선이 촬영되는 단지 파일 이름입니다.

다음 줄 이후의 모든 라인이 뭔가 다른 변화가 일어나는 때까지이 지정하는 파일에서 온 을보고됩니다. filename은 문자열의 일반 규칙에 따라 해석됩니다. 상수 : 백 슬래시 이스케이프가 해석됩니다.

그리고이 모든 정보

는 단일 #를 들어 https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Controlhttps://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html#Preprocessor-Output

에서 가져온 것입니다 :

널 지시어는 (를 포함하여 공백 만있는 줄 바꿈 다음에 '#'으로 구성 주석). 널 (null) 지정 문은 전처리 지시문으로 이해되지만 전 처리기 출력에는 영향을 미치지 않습니다. null 지시어의 가장 중요한 의미는 '#'으로 구성된 입력 행은 '#'을 포함하는 출력 행이 아니라 출력을 생성한다는 것입니다. 아마도 일부 오래된 C 프로그램에는 이러한 행이 포함되어있을 것입니다.

https://gcc.gnu.org/onlinedocs/cpp/Other-Directives.html#Other-Directives

2

라인 시작시 #은 사전 처리 지시문을 도입합니다. 전처리는 개념적으로 컴파일 작업보다 초기 단계이기 때문에 쉽게 인식 할 수있는 구문을 사용합니다.

#include, define, undef, line, error 또는 pragma 이외의 아무것도 뒤에 있다면, 그것은 비 지침 (6.10p1)이며, 무시됩니다.

이것은 행의 시작 부분에있는 #은 컴파일러가 번역 단계간에 정보를 전달하는 간단한 방법임을 의미합니다. 여기에서는 소스 파일과 줄 번호 정보를 전달하는 데 사용됩니다.