programing

C에서의 #pragma 사용

yoursource 2022. 8. 10. 22:58
반응형

C에서의 #pragma 사용

의 용도는 무엇입니까?#pragma예를 들면요?

#pragma머신 고유 또는 운영체제 고유 명령어입니다.즉, 컴파일러에 대해 모든 머신과 운영체제에 적용되거나 적용되지 않을 수 있는 작업, 옵션 설정, 액션 실행, 기본값 덮어쓰기 등을 지시합니다.

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

#pragma는 C에서 구현 고유의 무언가를 수행하기 위해 사용됩니다.즉, 이념적으로 독단적인 것이 아니라 현재의 컨텍스트에 대해 실용적입니다.

제가 자주 쓰는 건#pragma pack(1)내장형 솔루션에서 메모리 공간을 더 많이 확보하려고 합니다. 그렇지 않으면 8바이트 얼라인먼트가 될 수 있는 구조 어레이를 사용합니다.

아쉽게도, 우리는#dogma아직. 재밌을 것 같아요;)

일반적으로 #pragmas는 컴파일러 의존도가 높고 휴대성이 없기 때문에 가능하면 사용하지 않도록 합니다.만약 당신이 그것들을 휴대용 방식으로 사용하고 싶다면, 당신은 모든 플러그마를 둘러싸야 할 것입니다.#if/#endif쌍. GCC는 다른 컴파일러와의 호환성을 위해 이들 중 일부만 지원합니다. GCC는 다른 컴파일러가 플러그마를 사용하는 것과 동일한 작업을 수행하는 다른 방법이 있습니다.

예를 들어, 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 코드를 포팅하려면 각 플러그마를 에워싸야 합니다.#if/#endif한 쌍. 예쁘지 않아.

위의 모든 답변은 다음을 설명하는 데 도움이 됩니다.#pragma하지만 저는 작은 예를 하나 더 추가하고 싶었습니다.

제가 설명드리고 싶은 건simple OpenMP example용도를 몇 가지 증명하는 것#pragma그 일을 하기 위해서

OpenMpbriefly멀티플랫폼 공유 메모리 병렬 프로그래밍 구현입니다(그렇다면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그랬다...

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

이것은 의 하나일 뿐이다.many many applications작은 것들로 할 수 있다#pragma

외부 샘플은 죄송합니다.OpenMP

놓는 것#pragma once헤더 파일의 선두에 있는 것은, 1 회만 포함되어 있는 것을 확인합니다.주의:#pragma once는 표준 C99는 아니지만 대부분의 최신 컴파일러에서 지원됩니다.

방법으로는 guards( 인크루드 가드)를할 수 .#ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */)

가장 좋은 조언은 컴파일러의 문서를 참조하는 것입니다.플러그마는 정의에 따라 구현에 따라 다르기 때문입니다.예를 들어 임베디드 프로젝트에서는 코드와 데이터를 다른 섹션에서 찾거나 인터럽트 핸들러를 선언하기 위해 사용합니다.

#pragma code BANK1
#pragma data BANK2

#pragma INT3 TimerHandler

#pragma startup는 메인 뒤에 를 들어 메인 함수 뒤에 다른 함수를 호출합니다.

#pragma startup func1
#pragma exit func2

서서,,func1 달리다main ★★★★★★★★★★★★★★★★★」func2이 후에 실행됩니다.

Turbo-C는 Turbo-C로, Turbo-C는 Turbo-C로, Turbo-C는 Turbo-C를 사용합니다.이 하려면 , GCC 를 「GCC」, 「」라고 할 수 .func1 ★★★★★★★★★★★★★★★★★」func2음음음같 뭇매하다

void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();

이것은 특정 기능을 켜거나 끌 때 사용할 수 있는 프리프로세서 디렉티브입니다.

입니다.#pragma startup,#pragma exit ★★★★★★★★★★★★★★★★★」#pragma warn.

#pragma startup프로그램 시작 시 호출되는 함수를 지정할 수 있습니다.

#pragma exit프로그램 종료 시 호출되는 함수를 지정할 수 있습니다.

#pragma warn는 모든 경고를 억제하도록 컴퓨터에 지시합니다.

많은 타수수수수 many#pragma스타일을 사용하여 컴파일러를 제어할 수 있습니다.

가 것은#pragma는, 고유의 를 들어 되어 있는 해, 「」를 사용해 그의 ISR 를 할 수 .예를 들어 ISR이 기술된 특정 주소에서 프로그램카운터를 읽어들이는 상황을 나타냅니다.이 경우 를 사용하여 해당 로케이션의 ISR을 지정할 수 있습니다.#pragma vector=ADC12_VECTOR및 rotines and and and and ines and and and and and ines and and and and and and 。

로 말하면, 요 to to to to#pragma컴파일러에게 작업을 지시합니다.츠키다

  • #pragma를 사용하여 컴파일러 경고를 무시할 수 있습니다.예를 들어 암묵적 함수 선언에 대해 GCC를 셧다운하려면 다음과 같이 입력합니다.

    #pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
    

    이전 버전에서는 이 기능을 휴대할 수 있습니다.

  • #pragma once헤더 파일의 선두에 써넣을 경우,는 해당 헤더 파일을 1회 포함합니다. libportable 는 일단 지원되는 플러그마를 체크합니다.

언급URL : https://stackoverflow.com/questions/232785/use-of-pragma-in-c

반응형