#pragma
예제와 함께 C에서 사용하는 것은 무엇입니까 ?
#pragma
예제와 함께 C에서 사용하는 것은 무엇입니까 ?
답변:
#pragma
기계 별 또는 운영 체제 별 컴파일러 지시문을위한 것입니다. 즉, 컴파일러에게 작업을 수행하고, 일부 옵션을 설정하고, 조치를 취하고, 일부 기본값을 재정의하도록 지시합니다. 시스템.
자세한 내용은 msdn 을 참조하십시오 .
#pragma
C에서 특정 구현을 수행하는 데 사용됩니다. 즉, 이데올로기 적으로 독단적이기보다는 현재 컨텍스트에 대해 실용적이어야합니다.
내가 정기적으로 사용하는 것은 #pragma pack(1)
8 바이트 정렬로 끝나는 구조 배열을 사용하여 임베디드 솔루션에서 메모리 공간을 더 많이 차지하려는 곳입니다.
#dogma
아직 안타깝 네요 . 재미 있겟군요 ;)
pragma(1)
속도도 실제로 향상 되지 않습니까? stackoverflow.com/questions/3318410/…
나는 일반적으로 #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
쌍으로 묶어야 합니다. 예쁘지 않은.
struct __attribute__((__packed__)) PackedStructure
hack
가 인식하지 못하는 pragma를 만났을 때 실행되는 경우 비준수 상태가되게합니다. 예전에는 아주 아주 오래 전에 사용했던 것처럼 참조 #pragma
및 GCC 등)
#pragma once
헤더 파일의 맨 위에 놓으면 한 번만 포함됩니다. 참고 #pragma once
C99 표준은 아니지만 대부분의 현대적인 컴파일러에 의해 지원.
사용 경비를 포함하는 대신 (예입니다 #ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
필자의 가장 좋은 조언은 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
#pragma startup
주 함수 앞에 함수를 호출하고 주 함수 뒤에 다른 함수를 호출하는 데 사용되는 지시문입니다. 예 :
#pragma startup func1
#pragma exit func2
여기서는 func1
이전 main
에 func2
실행되고 이후에 실행됩니다.
참고 :이 코드는 Turbo-C 컴파일러에서만 작동합니다. GCC에서이 기능을 달성하기 위해 다음 func1
과 func2
같이 선언 할 수 있습니다 .
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
요약 #pragma
하면 컴파일러에게 작업을 지시합니다. 사용하는 몇 가지 방법은 다음과 같습니다.
#pragma
컴파일러 경고를 무시하는 데 사용할 수 있습니다. 예를 들어, 암시 적 함수 선언에 대해 GCC를 종료하려면 다음과 같이 작성할 수 있습니다.
#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
의 이전 버전 libportable
은이를 이식 가능하게 합니다.
#pragma once
, 헤더 파일의 맨 위에 작성되면 해당 헤더 파일이 한 번 포함됩니다. 한 번 지원되는 pragma를 libportable
확인 합니다.
#pragma
지시문은 전처리 단계에서 살아남습니다. 달리#include
하고#define
.