[c] C에서 #pragma 사용

#pragma예제와 함께 C에서 사용하는 것은 무엇입니까 ?



답변

#pragma 기계 별 또는 운영 체제 별 컴파일러 지시문을위한 것입니다. 즉, 컴파일러에게 작업을 수행하고, 일부 옵션을 설정하고, 조치를 취하고, 일부 기본값을 재정의하도록 지시합니다. 시스템.

자세한 내용은 msdn 을 참조하십시오 .


답변

#pragma C에서 특정 구현을 수행하는 데 사용됩니다. 즉, 이데올로기 적으로 독단적이기보다는 현재 컨텍스트에 대해 실용적이어야합니다.

내가 정기적으로 사용하는 것은 #pragma pack(1)8 바이트 정렬로 끝나는 구조 배열을 사용하여 임베디드 솔루션에서 메모리 공간을 더 많이 차지하려는 곳입니다.

#dogma아직 안타깝 네요 . 재미 있겟군요 😉


답변

나는 일반적으로 #pragma의 사용을 피하려고 할 것이다. 왜냐하면 그것들은 매우 컴파일러에 의존적이고 이식성이 없기 때문이다. 휴대용 방식으로 사용하려면 모든 pragma를 #if/ #endif쌍 으로 둘러싸 야합니다 . GCC는 pragma의 사용을 권장하지 않으며 실제로 다른 컴파일러와의 호환성을 위해 일부만 지원합니다. GCC에는 다른 컴파일러가 pragma를 사용하는 것과 동일한 작업을 수행하는 다른 방법이 있습니다.

예를 들어, 다음은 MSVC에서 구조가 단단히 패킹되었는지 (즉, 멤버 사이에 패딩이 없는지) 확인하는 방법입니다.

#pragma pack(push, 1)
struct PackedStructure
{
  char a;
  int b;
  short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7

GCC에서 동일한 작업을 수행하는 방법은 다음과 같습니다.

struct PackedStructure __attribute__((__packed__))
{
  char a;
  int b;
  short c;
};
// sizeof(PackedStructure == 7)

GCC 코드는 더 이식성이 있습니다. GCC가 아닌 컴파일러로 컴파일하려면 다음과 같이하면됩니다.

#define __attribute__(x)

MSVC 코드를 이식하려면 각 pragma를 #if/ #endif쌍으로 묶어야 합니다. 예쁘지 않은.


답변

#pragma once헤더 파일의 맨 위에 놓으면 한 번만 포함됩니다. 참고 #pragma onceC99 표준은 아니지만 대부분의 현대적인 컴파일러에 의해 지원.

사용 경비를 포함하는 대신 (예입니다 #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)


답변

내가 느끼는 것은 #pragma당신이 코드가 프로그램 카운터가 ISR은 당신이 사용하여 해당 위치에 ISR을 지정할 수 있습니다 후 기록 된 특정 주소에서 읽고 싶은 상황 .say 위치 구체적하려는 경우 지침입니다 #pragma vector=ADC12_VECTOR의해 followd 인터럽트 로틴 이름 및 설명


답변

필자의 가장 좋은 조언은 pragma가 정의에 따라 구현에 따라 다르기 때문에 컴파일러의 문서를 보는 것입니다. 예를 들어, 임베디드 프로젝트에서는 다른 섹션에서 코드와 데이터를 찾거나 인터럽트 핸들러를 선언하는 데 사용했습니다. 즉 :

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler


답변

위의 모든 답변은 좋은 설명 #pragma이지만 작은 예를 추가하고 싶었습니다.

작업을 수행하는 simple OpenMP example데 몇 가지 용도를 보여주는 설명 #pragma을하려고합니다.

OpenMP는 briefly멀티 플랫폼 공유 메모리 병렬 프로그래밍을위한 구현 (다음 우리가 말할 수 있습니다 machine-specific또는 operating-system-specific)

예제로 가자

#include <stdio.h>
#include <omp.h>// compile with: /openmp

int main() {
   #pragma omp parallel num_threads(4)
   {
      int i = omp_get_thread_num();
      printf_s("Hello from thread %d\n", i);
   }
}

출력은

Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3

Note that the order of output can vary on different machines.

이제 무슨 일을 #pragma했는지 말씀 드리겠습니다 …

4 개의 스레드에서 일부 코드 블록을 실행하도록 OS에 지시합니다.

이것은 many many applications여러분 중 하나 일뿐 입니다.#pragma

외부 샘플 죄송합니다 OpenMP