programing

#pragma는 한번 자동으로 상정되지 않는 이유는 무엇입니까?

copyandpastes 2022. 7. 3. 18:32
반응형

#pragma는 한번 자동으로 상정되지 않는 이유는 무엇입니까?

컴파일러에게 파일을 한 번만 포함하라고 하는 이유가 무엇입니까?기본적으로 말이 되지 않을까요?단일 파일을 여러 번 포함해야 하는 이유가 있습니까?왜 그냥 추측하지 않는 거죠?특정 하드웨어와 관련이 있습니까?

여기에는 여러 가지 관련 질문이 있습니다.

  • ?는 왜?#pragma once동으으 강제 ?? ????
    파일을 여러 번 포함하려는 경우가 있기 때문입니다.

  • 파일을 여러 번 포함하려는 이유는 무엇입니까?
    다른 답변(부스트)에는 몇 가지 이유가 제시되어 있습니다.프리프로세서, X-Macros, 데이터 파일 포함)."코드 중복 방지"의 특별한 예를 추가하고 싶습니다. OpenFOAM은 다음과 같은 스타일을 장려합니다.#include함수의 비트와 조각을 입력하는 것은 일반적인 개념입니다.예를 들어 이 설명을 참조하십시오.

  • 좋아요, 그런데 왜 옵트아웃이 기본값이 아닐까요?
    그것은 실제로 규격에 명시되어 있지 않기 때문입니다. #pragma는 정의상 구현 고유의 확장입니다.

  • ?는 왜?#pragma once아직 표준화된 기능이 되지 않았습니까(광범위하게 지원되고 있습니다)?
    플랫폼에 구애받지 않는 방법으로 '같은 파일'을 특정하는 것은 의외로 어렵습니다.상세한 것에 대하여는, 이 회답을 참조해 주세요.

하시면 됩니다.#include 파일 내 어디에서나 사용할 수 있습니다(필요한 경우 여러 번).물론, 보기 흉하고 좋은 스타일은 아니지만, 때로는 (포함하는 파일에 따라) 가능하기도 하고 실용적이기도 합니다.한다면#include단한면 면면면 면면면면 면면 면면면면면#include덤 텍스트는 cut'n'transfer (cut'n'transfer) 입니다.'아까보다' 이런 으로 하면 될 것 같아요.#include하기 위한 생성 하는 파일std::vector를 들면

std::vector<int> data = {
#include "my_generated_data.txt"
}

또한 "my_generated_data.txt"는 컴파일 중에 빌드 시스템에서 생성된 것입니다.

아니면 제가 게으름뱅이/바보/바보일 수도 있고, 파일을 만들 수도 있습니다(매우 치밀한 예).

const noexcept;

그리고 나서 나는 한다

class foo {
    void f1()
    #include "stupid.file"
    int f2(int)
    #include "stupid.file"
};

또 다른 을 들 수 , '네임스페이스'라고만 말하고.using namespace foo;글로벌 네임스페이스를 원하지 않는 다른 많은 것으로 폴리싱할 수 있기 때문입니다. '라는 파일을 , '푸'푸'라는 파일'푸'푸'라는 파일'푸'라는 파일이에요.

using std::vector;
using std::array;
using std::rotate;
... You get the idea ...

그런 다음 소스 파일에서 이 작업을 수행합니다.

void f1() {
#include "foo" // needs "stuff"
}

void f2() {
    // Doesn't need "stuff"
}

void f3() {
#include "foo" // also needs "stuff"
}

주의: 저는 이런 일을 하는 것을 지지하지 않습니다.하지만 그것은 가능하고 몇몇 코드베이스에서 행해지고 나는 왜 그것이 허용되어서는 안 되는지 모르겠다.그것은 쓸모가 있다.

「 」, 「 」, 「 」, 「 」)의 값에 따라 다르게 .#define후 수 따라서 소스 파일의 동작을 얻을 수 .

여러 번 포함할 수 있습니다. 예를 들어 X-macro 기술을 사용하면 다음과 같습니다.

data.inc:

X(ONE)
X(TWO)
X(THREE)

use_data_inc_inc.c

enum data_e { 
#define X(V) V,
   #include "data.inc"
#undef X
};
char const* data_e__strings[]={
#define X(V) [V]=#V,
   #include "data.inc"
#undef X
};

다른 용도는 모릅니다.

언어에 존재하는 「#include」기능의 목적은, 프로그램을 복수의 컴파일 유닛으로 분해하는 것을 서포트하는 것이라고 가정하고 있는 것 같습니다.그건 틀렸어요.

그것은 그 역할을 수행할 수 있지만, 그것은 의도한 것이 아니었다.C는 원래 Unix를 재실장하기 위해 PDP-11 매크로-11 어셈블리보다 약간 상위 레벨의 언어로 개발되었습니다.매크로 프리프로세서가 탑재되어 있는 것은 매크로-11의 기능이기 때문입니다.새로운 C 컴파일러에 이식하고 있던 기존의 Unix가 사용하고 있던 Macro-11의 기능이기 때문에, 다른 파일의 매크로를 텍스트로 포함할 수 있었습니다.

여기서 "#include"는 약간의 해킹처럼 코드를 컴파일 단위로 분리하는 데 유용하다는 것이 밝혀졌습니다.그러나 이 해킹이 존재했다는 것은 C에서 행해지는 The Way가 되었다는 것을 의미합니다.방법이 존재한다는 것은 이 기능을 제공하기 위해 새로운 방법을 만들 필요가 없다는 것을 의미하기 때문에 더 안전한 방법(복수 인크루션에 취약하지 않음)은 만들어지지 않았습니다.이미 C에 있었기 때문에 C의 구문과 관용구의 대부분과 함께 C++로 복사되었습니다.

C++에 적절한 모듈 시스템을 제공하자는 제안이 있어 45년 된 이 프리프로세서 해킹이 마침내 없어질 수 있습니다.하지만 나는 이것이 얼마나 임박한지 모른다.10년 이상 작업 중이라고 들었어요.

아니요, 이것은 예를 들어 도서관 작성자가 사용할 수 있는 선택지를 크게 방해합니다.예를 들어 Boost와 같이 입력합니다.프리프로세서를 사용하면 프리프로세서 루프를 사용할 수 있습니다.이러한 루프를 실현하는 유일한 방법은, 같은 파일의 복수의 인크루드입니다.

그리고 부스트.프리프로세서는 많은 매우 유용한 라이브러리의 구성 요소입니다.

제가 주로 작업하는 제품의 펌웨어에서는 메모리에서 함수 및 글로벌/스태틱 변수를 할당해야 할 위치를 지정할 수 있어야 합니다.실시간 처리는 L1 메모리 온 칩에 존재해야 프로세서가 직접 고속으로 액세스할 수 있습니다.L2 메모리 온 칩에는 그다지 중요하지 않은 처리가 포함될 수 있습니다.또, 특별히 신속히 처리할 필요가 없는 것은, 외장 DDR로 동작해, 캐싱을 실시할 수 있습니다.좀 느리더라도 상관없기 때문입니다.

#pragma는 사물이 가는 곳을 할당하는 데 사용하는 긴 행입니다.틀리기 쉬울 거예요.잘못하면 코드/데이터가 디폴트(DDR) 메모리에 사일런트하게 들어가 버립니다. 결과 클로즈드 루프 제어가 아무 이유 없이 동작하지 않게 되는 경우가 있습니다.

그래서 저는 include files를 사용합니다.이 파일에는 그 플러그마만 포함되어 있습니다.현재 코드는 다음과 같습니다.

헤더 파일...

#ifndef HEADERFILE_H
#define HEADERFILE_H

#include "set_fast_storage.h"

/* Declare variables */

#include "set_slow_storage.h"

/* Declare functions for initialisation on startup */

#include "set_fast_storage.h"

/* Declare functions for real-time processing */

#include "set_storage_default.h"

#endif

그리고 소스...

#include "headerfile.h"

#include "set_fast_storage.h"

/* Define variables */

#include "set_slow_storage.h"

/* Define functions for initialisation on startup */

#include "set_fast_storage.h"

/* Define functions for real-time processing */

헤더에만 같은 파일이 여러 개 포함되어 있는 것을 알 수 있습니다.지금 잘못 입력하면 컴파일러에서 include 파일 "set_fat_storage"를 찾을 수 없다는 메시지가 나타납니다.h"는 쉽게 고칠 수리가 가능합니다.

질문에 대한 답변으로, 이것은 여러 개의 포함이 필요한 실제 사례입니다.

언급URL : https://stackoverflow.com/questions/53416657/why-isnt-pragma-once-automatically-assumed

반응형