📜  C / C++中的#pragma指令

📅  最后修改于: 2021-05-25 21:13:44             🧑  作者: Mango

该指令是一种特殊用途的指令,用于打开或关闭某些功能。这类指令是特定于编译器的,即它们随编译器的不同而不同。下面讨论了一些#pragma指令:

  1. #pragma startup和#pragma exit :这些指令可帮助我们指定程序启动之前(控件传递到main()之前)和程序退出之前(控件从main()返回之前)所需运行的功能。 。

    注意:以下程序不适用于GCC编译器。
    看下面的程序:

    #include 
        
    void func1(); 
    void func2(); 
        
    #pragma startup func1 
    #pragma exit func2 
        
    void func1() 
    { 
        printf("Inside func1()\n"); 
    } 
        
    void func2() 
    { 
        printf("Inside func2()\n");    
    } 
        
    int main() 
    { 
        printf("Inside main()\n"); 
            
        return 0; 
    } 
    
    输出:
    Inside func1()
    Inside main()
    Inside func2()
    

    在GCC编译器上运行时,上面的代码将产生以下给出的输出:

    Inside main()
    

    发生这种情况是因为GCC不支持#pragma启动或exit 。但是,您可以将以下代码用于GCC编译器上的类似输出。

    #include 
        
    void func1(); 
    void func2(); 
        
    void __attribute__((constructor)) func1(); 
    void __attribute__((destructor)) func2(); 
        
    void func1() 
    { 
        printf("Inside func1()\n"); 
    } 
        
    void func2() 
    { 
        printf("Inside func2()\n");  
    } 
        
    int main() 
    { 
        printf("Inside main()\n"); 
            
        return 0; 
    } 
    
    输出:
    Inside func1()
    Inside main()
    Inside func2()
    
  2. #pragma warn指令:此指令用于隐藏在编译过程中显示的警告消息。当我们有一个大型程序并且我们想在查看警告之前解决所有错误时,这对我们可能很有用,然后使用它可以通过隐藏所有警告来专注于错误。我们可以通过在语法上稍作更改再次使警告可见。

    语法

    #pragma warn +xxx (To show the warning)
    #pragma warn -xxx (To hide the warning)
    #pragma warn .xxx (To toggle between hide and show)
    

    我们可以隐藏警告,如下所示:

    • 的#pragma警告-rvl:这个指令皮革时应该返回一个值的函数没有返回值被上调的警告。
    • #pragma warn -par :此伪指令隐藏那些在函数不使用传递给它的参数时引发的警告。
    • #pragma warn -rch :此伪指令将隐藏无法访问代码时发出的警告。例如:在函数的return语句之后编写的任何代码均不可访问。

    范例

    // Example to explain the working of 
    // #pragma warn directive
    // This program is compatible with C/C++ compiler 
      
    #include
      
    #pragma warn -rvl /* return value */
    #pragma warn -par /* parameter never used */
    #pragma warn -rch /*unreachable code */
            
    int show(int x)
    {   
        // parameter x is never used in
        // the function
          
        printf("GEEKSFORGEEKS");
          
        // function does not have a
        // return statement
    }
                
    int main()
    {
        show(10);
          
        return 0;
    }
    
    输出:
    GEEKSFORGEEKS
    

    上面的程序编译成功,没有任何警告,输出为“ GEEKSFORGEEKS”。

  3. #pragma GCC毒物:GCC编译器支持此伪指令,该伪指令用于从程序中完全删除标识符。如果要阻止标识符,则可以使用#pragma GCC毒药指令。

    范例

    // Program to illustrate the 
    // #pragma GCC poison directive
      
    #include
      
    #pragma GCC poison printf
      
    int main()
    {
        int a=10;
          
        if(a==10)
        {
            printf("GEEKSFORGEEKS");
        }
        else
            printf("bye");
      
        return 0;
    }
    

    上面的程序将给出以下错误:

    prog.c: In function 'main':
    prog.c:14:9: error: attempt to use poisoned "printf"
             printf("GEEKSFORGEEKS");
             ^
    prog.c:17:9: error: attempt to use poisoned "printf"
             printf("bye");
             ^
    
  4. #pragma GCC依赖项:#pragma GCC依赖项允许您检查当前文件和另一个文件的相对日期。如果另一个文件比当前文件更新,则发出警告。如果当前文件是从另一个文件派生的,并且应该重新生成,这将很有用。

    语法

    #pragma GCC dependency "parse.y"
    #pragma GCC dependency "/usr/include/time.h" rerun fixincludes
    
  5. #pragma GCC system_header :此编译指示不带任何参数。它导致将当前文件中的其余代码视为来自系统头文件。
  6. #pragma Once :#pragma Once指令具有非常简单的概念。即使程序员在编译过程中多次包含该指令,头文件也仅包含一次。这不包含在任何ISO C++标准中。该指令的工作方式与#include保护器惯用语相似。使用#pragma可以使程序避免多次包含优化。

    句法:

    #pragma once
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。