그러나 약간 이상한 질문이지만 올바르게 기억한다면 C ++ 소스 코드는 파일을 저장할 파일 시스템이 필요하지 않습니다.
카메라를 통해 손으로 쓴 종이를 스캔하는 컴파일러가 있으면이를 준수 할 수 있습니다. 실제로 그다지 의미가 없지만.
그러나 C ++ 20은 이제 file_name
. 이제 소스 코드가 항상 파일에 저장되어야 함을 의미합니까?
그러나 약간 이상한 질문이지만 올바르게 기억한다면 C ++ 소스 코드는 파일을 저장할 파일 시스템이 필요하지 않습니다.
카메라를 통해 손으로 쓴 종이를 스캔하는 컴파일러가 있으면이를 준수 할 수 있습니다. 실제로 그다지 의미가 없지만.
그러나 C ++ 20은 이제 file_name
. 이제 소스 코드가 항상 파일에 저장되어야 함을 의미합니까?
답변:
파이프 내에서 C ++를 완전히 컴파일 (및 링크)하여 컴파일러를 중간에 놓을 수 있습니다.
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
수십 년 동안 그랬습니다. 또한보십시오:
std::source_location
C ++ 20 의 도입은 이러한 상황을 변경하지 않습니다. 일부 코드에는 잘 정의 된 소스 위치가 없거나 잘 정의되어 있지만 그다지 의미가 없을 수 있습니다. 사실, 난 정의에 대한 주장 말할 것 std::source_location
공평, 그냥 매크로 이하의 동등한 비록 사용하여 파일이 ... 약간의 근시 인 __FILE__
및 __LINE__
어느 이미 C에 존재 ++ (그리고 C).
@ HBv6 __FILE__
은 표준 입력 스트림에서 GCC를 사용하여 컴파일 할 때 의 값을 인쇄하면 다음과 같이 표시 됩니다.
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
결과 실행 파일을 실행하면 인쇄 <stdin>
됩니다.
@Morwenn은이 코드를 다음과 같이 언급합니다.
#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>
// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
poplar::make_heap(data, data + size);
poplar::sort_heap(data, data + size);
}
GodBolt에서 작동합니다 (그러나 여러분의 컴퓨터에서는 작동하지 않습니다. 인기있는 컴파일러는 이것을 지원하지 않습니다.)
C ++ 프로그램 소스가 파일에서 가져와야하는지 여부에 대한 질문은 언어 표준에서 명확하게 답변되지 않았습니다. C ++ 17 표준 (n4713)의 초안을 살펴보면 섹션 5.1 [lex.separate]은 다음과 같습니다.
- 프로그램의 텍스트는이 문서에서 소스 파일이라는 단위로 유지됩니다. 모든 헤더 (20.5.1.2) 및 전처리 지시문 #include를 통해 포함 된 소스 파일 (19.2)과 함께 소스 파일과 함께 조건부 포함 (19.1) 전처리 지시문에서 건너 뛴 소스 행을 제외하고 변환 단위라고합니다.
따라서 소스 코드는 반드시 파일 자체가 아니라 "소스 파일이라고하는 단위"에 보관됩니다. 그렇다면 포함은 어디에서 왔습니까? 파일 시스템의 명명 된 파일에서 온다고 가정 할 수 있지만 그 역시 필수 사항은 아닙니다.
여하튼, std::source_location
C ++ 20에서이 표현을 변경하거나 해석 (AFAICT)에 영향을 미치지 않는 것 같습니다.
C ++ 20 이전에도 표준은 다음과 같습니다.
__FILE__
현재 소스 파일의 추정 이름 (문자열 리터럴)입니다.
정의는 source_location::file_name
.
따라서 C ++ 20에서 파일 시스템없는 구현에 대한 지원과 관련하여 변경된 사항은 없습니다.
표준은 "소스 파일"이 무엇을 의미하는지 정확히 정의하지 않으므로 파일 시스템을 참조하는지 여부는 해석에 달려 있습니다. 아마도 해당 언어 구현에서 실제로 "소스 파일"을 식별하는 경우 "그때 내게 준 손으로 쓴 메모"를 생성하는 구현에 적합 할 수 있습니다.
결론 : 예, 소스는 표준에서 "파일"이라고하지만 "파일"이 무엇인지, 파일 시스템이 관련되어 있는지 여부는 지정되지 않습니다.
scanner-c++
반환되는 것을 볼 수 있습니다 .
__FILE__
. 클래스source_location
는 함수 호출 사이트에서 얻을 수 있습니다.