2016-06-09 32 views
2

我在SunOS 5.11(Solaris 11.3)上的Sun Studio 12.3下工作。我需要查看Sun Studio定義的宏以修復套件下的錯誤報告。這與Solaris and Preprocessor Macros類似,但引用的問題使用GCC及其預處理器;而不是Sun Studio的預處理器。如何在Sun Studio下打印預處理器宏?

我運行了CC -flags,但我沒有看到類似於GCC的cpp -dMg++ -dM -E - </dev/null的選項。 CC確實有-E,但其相當貧血,不打印任何預處理器定義:

$ echo $CXX 
/opt/solarisstudio12.3/bin/CC 
$ $CXX -E /dev/null 
#1 "/dev/null" 

使用一個真正的測試文件產生相似的結果 - 預處理宏缺失:

$ $CXX -E test.cxx | grep __cplusplus 
$ 

我還發現在Sun Studio手冊中討論預處理器宏。表A-2是可以的,但它也主要是貧血。其缺少的基礎知識如__cplusplus,其缺失的其他定義如_RWSTD_NO_CLASS_PARTIAL_SPEC

如何在Sun Studio下打印預處理器宏?


$ /opt/solarisstudio12.3/bin/CC -flags 
______________________________________________________________________________ 
Items within [ ] are optional. Items within < > are variable parameters. 
Bar | indicates choice of literal values. 
______________________________________________________________________________ 
-#       Verbose mode 
-###       Show compiler commands built by driver, no compilation 
-B[static|dynamic]   Specify dynamic or static binding 
-D<name[=token]>    Associate name with token as if by #define 
-E       Compile source through preprocessor only, output to stdout 
-G       Build a dynamic shared library 
-H       Print path name of each file included during compilation 
-I<dir>      Add <dir> to preprocessor #include file search path 
-KPIC       Compile position independent code with 32-bit addresses 
-Kpic       Compile position independent code 
-L<dir>      Pass to linker to add <dir> to the library search path 
-M<file>      Pass <file> mapfile to linker 
-O       Use default optimization level (-xO3) 
-O<n>       Same as -xO<n> 
-P       Compile source through preprocessor only, output to .i file 
-PIC       Same as -KPIC 
-Qoption <prog> <o>[,<o>...] Pass options list <o> to compilation phase <prog> 
-R<dir[:dir]>     Build runtime search path list into executable 
-S       Compile and only generate assembly code (.s) 
-U<name>      Delete initial definition of preprocessor symbol <name> 
-V       Report version number of each compilation phase 
-W<c>,<arg>     Pass <arg> to specified component <c> (a,d,h,i,l,m,p,u,0,2) 
-Xlinker <arg>    Pass <arg> to linker 
-Xm       Support dollar character in C++ identifiers 
-Y<c>,<dir>     Specify <dir> for location of component <c> (a,l,m,p,0,h,i,u) 
-YA,<dir>      Change default directory searched for components 
-YI,<dir>      Change default directory searched for include files 
-YP,<dir>      Change default directory for finding libraries files 
-YS,<dir>      Change default directory for startup object files 
-c       Compile only - produce .o files, suppress linking 
-compat=5      Standard mode; accept source code that conforms to the C++ standard (default mode) 
-compat=g      G++ compatibility mode; accept g++ source code and generate g++ compatible object code 
+d       Do not expand inline functions 
-dalign      Ignored 
-d{n|y}      Dynamic [-dy] or static [-dn] option to linker 
-dryrun      Show compiler commands built by driver, no compilation 
-e<arg>      Passed to linker 
-erroff[=<tags>]    Suppress warnings specified by tags; <tags>={%none, %all, <tag list>} 
-errtags[={yes|no}]   Display messages with tags 
-errwarn[=<tags>]    Treats warnings specified by tags as errors; <tags>={%none, %all, <tag list>} 
-fPIC       Same as -KPIC 
-fast       Optimize using a selection of options 
-features=<a>[,<a>]   Enable/disable various C++ language features 
-filt[=<a>[,<a>]]    Control the filtering of both linker and compiler error messages; 
           <a>={errors,names,returns,stdlib} 
-flags      Show this summary of compiler options 
-flagsrc=<f>     Accept command options from file <f> 
-fnonstd      Initialize floating-point hardware to non-standard preferences 
-fns[={yes|no}]    Select non-standard floating point mode 
-fpic       Same as -Kpic 
-fprecision=<a>    Set FP rounding precision mode; <a>={single|double|extended} 
-fround=<r>     Select the IEEE rounding mode in effect at startup 
-fsimple[=<n>]    Select floating-point optimization preferences <n> 
-fstore      Force floating pt. values to target precision on assignment 
-ftrap=<t>     Select floating-point trapping mode in effect at startup 
-g       Compile for debugging 
-g0       Compile for debugging by dbx but allow inlining 
-g3       Compile for debugging by dbx including macros. 
-h <name>      Assign <name> to generated dynamic shared library 
-help       Same as -xhelp=flags 
-i       Passed to linker to ignore any LD_LIBRARY_PATH setting 
-include <file>    Include the contents of <file> before other files 
-inline=<v>     Attempt inlining of specified user routines; <v>={%auto,<func>,no%<func>} 
-instances=<a>    Control the link attributes of template instantiations; 
           <a>={static|global|extern|explicit|semiexplicit} 
-instlib=<library>   Inhibit generation of instances already in <library> 
-keeptmp      Keep temporary files created during compilation 
-l<name>      Link with library lib<name>.a or lib<name>.so 
-libmieee      Same as -xlibmieee 
-libmil      Same as -xlibmil 
-library=<a>[,<a>]   Incorporates specified CC-provided libraries into compilation and linking 
-m32       Set 32-bit addressing model 
-m64       Set 64-bit addressing model 
-mc       Remove duplicate strings from .comment section of output files 
-migration     Show where to get information about migrating from C++ 4.2 
-mr       Remove all strings from .comment section of output files 
-mr,"string"     Remove all strings and append "string" to .comment section 
-mt[={yes|no}]    Specify options needed when compiling multi-threaded code 
-native      Optimize for the host system (-xtarget=native) 
-noex       Same as -features=no%except 
-nofstore      Do not force floating pt. values to target precision on assignment 
-o <outputfile>    Set name of output file to <outputfile> 
-p       Compile for profiling with prof 
+p       Ignore non-standard preprocessor asserts 
-pg       Compile for profiling with gprof 
-pic       Same as -Kpic 
-qp       Compile for profiling with prof 
-s       Strip symbol table from the executable file 
-shared      Same as -G 
-staticlib=<a>[,<a>]   Force linkage of specified libraries to be static 
-sync_stdio[={yes|no}]  Controls synchronization of the I/O libraries 
-temp=<path>     Use <path> as directory for temporary files 
-template=<a>[,<a>]   Enable/disable various template options; 
           <a>={wholeclass,extdef,geninlinefuncs} 
-time       Same as -xtime 
-traceback[=<a>[,<a>]]  Provide stack traceback for the abnormal termination by signals; <a>={%none|common|<signal>} 
-unroll=<n>     Enable unrolling loops <n> times where possible 
-v       Same as -verbose=diags 
-verbose=<a>[,<a>]   Control verbosity during compilation; <a>={template,diags,version} 
-w       Suppress compiler warning messages 
+w       Print warnings about additional questionable constructs 
+w2       Emit warnings for code with additional portability problems 
-xF[=<a>[,<a>]]    Compile for later mapfile reordering and data fragmentation 
-xM       Generate makefile dependencies 
-xM1       Generate makefile dependencies, but exclude /usr/include 
-xMD       Generate makefile dependencies and compile at once 
-xMMD       Generate makefile dependencies like -xMD, but excluding standard headers 
-xMF <file>     Specify output <file> for makefile dependencies dump 
-xMerge      Merge data segment into text segment 
-xO<n>      Generate optimized code; <n>={1|2|3|4|5} 
-xaddr32[={yes|no}]   Generate binaries assuming the associated process is restricted to the lower 32bit address space 
-xalias_level[=<a>]   Enable optimizations based on the specified alias_level; 
           <a>={any|simple|compatible} 
-xanalyze=code    Generate static analysis information for the code analyzer 
-xannotate[={yes|no}]   Annotate binaries for optimization and analysis 
-xar       Create archive library with instantiated templates 
-xarch=<a>     Specify target architecture instruction set 
-xautopar      Enable automatic loop parallelization 
-xbuiltin[=<a>]    Inline system functions and intrinsics when beneficial; 
           <a>={%none|%default|%all} 
-xcache=<t>     Define cache properties for use by optimizer 
-xchar[=<a>]     Treat type char as signed (s) or unsigned (u); 
           <a>={s|signed|u|unsigned} 
-xcheck[=<a>[,<a>]]   Generate runtime checks for error condition; 
           <a>={stkovf,init_local} 
-xchip=<a>     Specify the target processor for use by the optimizer 
-xcode=<a>     Generate different code for forming addresses; <a>={pic13|pic32} 
-xdebugformat=<a>    Selects the format of debugging information; <a>={stabs|dwarf} 
-xdepend[={yes|no}]   Analyze loops for data dependencies 
-xdumpmacros[=<a>[,<a>]]  Prints macro definitions on the standard error output; 
           <a>={defs,undefs,use,loc,conds,sys} 
-xdryrun      The same as -### 
-xe       Perform only syntax/semantic checking, no code generation 
-xhelp=<a>     Display on-line help information; <a>={flags|readme} 
-xia       Enable interval arithmetic 
-xinline=<v>     Attempt inlining of specified user routines; <v>={%auto,<func>,no%<func>} 
-xinstrument=[no_]datarace Enable/disable instrumentation for race detection tool 
-xipo[=<n>]     Enable optimization and inlining across source files; <n>={0|1|2} 
-xipo_archive=<a>    Enable crossfile optimization including archive files; 
           <a>={none|readonly|writeback} 
-xivdep[=<a>]     Ignore loop-carried dependences on array references in a loop; <a>={loop|loop_any|back|back_any|none} 
-xjobs=<n>     Maximum number of components compiler will fork in parallel 
-xkeepframe[=<v>]    Do not optimize stack frame of specified user routine; <v>={%all|%none|[no%]<func>} 
-xlang=<a>[,<a>]    The set of languages used in the program; <a>={f90,f95,c99} 
-xldscope=<a>     Indicates the appropriate linker scoping within the source program; 
           <a>={global|symbolic|hidden} 
-xlibmieee     Force IEEE 754 return values for math routines in exceptional cases 
-xlibmil      Inline selected libm math routines for optimization 
-xlibmopt      Link with optimized math library 
-xlic_lib=sunperf    (Obsolete) Use -library=sunperf instead 
-xloopinfo     Show loops that parallelized 
-xmaxopt=[off,1,2,3,4,5]  Maximum optimization level allowed on #pragma opt 
-xmodel=<a>     Specify memory model for 64-bit programs; 
           <a>={small|kernel|medium} 
-xnolib      Do not link with default system libraries 
-xnolibmil     Cancel -xlibmil on command line 
-xnolibmopt     Cancel -xlibmopt on command line 
-xnorunpath     Do not build a runtime search path into the executable 
-xopenmp[=<a>]    Enable OpenMP language extension; <a>={none|noopt|parallel} 
-xpagesize=<a>    Controls the preferred page size for the stack and for the heap; <a>={4K|2M|4M|1G|default} 
-xpagesize_heap=<a>   Controls the preferred page size for the heap; <a>={4K|2M|4M|1G|default} 
-xpagesize_stack=<a>   Controls the preferred page size for the stack; <a>={4K|2M|4M|1G|default} 
-xpch=<t>      Enable precompiled headers. Collect data for, or use existing, PCH file; <t>={auto|autofirst|{collect,use}:<file>[.cpch]} 
-xpchstop=<file>    Specified include file marks end of initial common sequence of pre-processing directives for precompiled headers 
-xpec[={yes|no}]    Generate a PEC binary 
-xpg       Compile for profiling with gprof 
-xport64[=<a>]    Enable extra checking for code ported from 32-bit to 64-bit platforms; 
           <a>={no|implicit|full} 
-xprefetch[=<p>]    Specify instruction prefetch; <p>={auto,no%auto,explicit,no%explicit} 
-xprefetch_auto_type=<a>  Specify automatic indirect prefetch insertion for loops; 
           <a>={indirect_array_access} 
-xprefetch_level[=<n>]  Controls the aggressiveness of the -xprefetch=auto option; <n>={1|2|3} 
-xprofile=<t>     Collect data for a profile or use a profile to optimize; <t>={{collect,use}[:<path>],tcov} 
-xprofile_ircache[=<t>]  Path to intermediate file cache used with -xprofile option 
-xreduction     Recognize reduction operations in parallelized loops 
-xregs=<a>[,<a>]    Specify the usage of optional registers; <a>={frameptr} 
-xrestrict[=<f>]    Treat pointer valued function parameters as restricted; <f>={%none,%all,<function-name list>} 
-xs       Allow debugging without object (.o) files 
-xspace      Do not do optimizations that increase code size 
-xtarget=<a>     Specify target system for optimization 
-xtemp=<dir>     Set directory for temporary files to <dir> 
-xthreadvar[=<a>]    Control code generation for thread variables; <a>={dynamic} 
-xtime[=<a>]     Report the execution time for each compilation phase; <a>={1|2|3} 
-xtrigraphs[={yes|no}]  Enable|disable trigraph translation 
-xunroll=<n>     Enable unrolling loops <n> times where possible 
-xustr=<a>     Recognize sixteen-bit string literals; <a>={ascii_utf16_ushort|no} 
-xvector[=<a>[,<a>]]   Automatic generation of calls to the vector library functions and/or the generation of the SIMD instructions 
-xvpara      Verbose parallelization warnings 
-xwe       Convert all warnings to errors 

Suffix 'a'    Object library 
Suffix 'il'    Inline template file 
Suffix 'o'    Object file 
Suffix 'so'    Shared object 
Suffix 's'    Assembler source 
Suffix 'S'    Assembler source for cpp 
Suffix 'c'    C++ source 
Suffix 'cc'    C++ source 
Suffix 'cxx'   C++ source 
Suffix 'cpp'   C++ source 
Suffix 'C'    C++ source 
Suffix 'c++'   C++ source 
Suffix 'i'    C++ source after preprocessing 
Suffix 'err'   ld error file 
Suffix 'd'    Build dependencies file 

回答

6

使用-xdumpmacros選項。

Solaris Studio 12.4 C User's Guide

B.2.105 -xdumpmacros [=值,值...]]

使用時要查看宏如何在 程序的行爲此選項。該選項提供了諸如宏定義,未定義的 以及使用情況等信息。它根據處理宏的順序將輸出打印到標準的 錯誤(stderr)。 -xdumpmacros選項通過文件末尾或 生效,直到被dumpmacros或end_dumpmacros編譯指示覆蓋。見 dumpmacros

下表列出了的有效參數。前綴 no%禁用關聯的值。

...

cc -E -xdumpmacros /dev/null產生這樣的輸出:

#define __LINE__ 
#define __FILE__ 
#define __STDC__ 0 
#define __STDC_VERSION__ 199409L 
#define __DATE__ "Jun 9 2016" 
#define __TIME__ "09:09:48" 
#define __STDC_IEC_559__ 1 
#define __STDC_IEC_559_COMPLEX__ 1 
#define __STDC_HOSTED__ 1 
#define __SunOS_5_11 1 
#define __SUNPRO_C 0x5120 
#define __unix 1 
#define __SVR4 1 
#define __sun 1 
#define __SunOS 1 
#define __i386 1 
#define __BUILTIN_VA_ARG_INCR 1 
#define __C99FEATURES__ 1 
#define __PRAGMA_REDEFINE_EXTNAME 1 
#define unix 1 
#define sun 1 
#define i386 1 
#define __RESTRICT 1 
#define __FLT_EVAL_METHOD__ - 1 
#define __SUN_PREFETCH 1 
#define __NOVECTORSIZE__ 1 
# 1 "/dev/null" 
#ident "acomp: Sun C 5.12 SunOS_i386 2011/11/16" 
+0

非常感謝你。男人,我不知道我錯過了那個選擇。我想這是因爲我正在搜索「預處理」關鍵字,而不是「宏」關鍵字。 – jww

+0

相關,我瞭解到Sun Studio沒有定義'__SSE2__','__SSE3__','__SSSE3__'和朋友。但是,基於編譯器,它樂於消耗內在的東西。 – jww