Hi, I am receiving the error identifier "CLOCK_MONOTONIC" is undefined from cpptools for the below code, which I don't receive when compiling with gcc. If I include "defines": ["_POSIX_C_SOURCE 199309L"] in c_cpp_properties.json then the issue is resolved and cpptools doesn't complain.
My question is, why is this behavior different when I compile with gcc? I believe the default C standard for gcc is gnu11, which doesn't require _POSIX_C_SOURCE to be defined. Is cpptools using a different standard, and if so is there a way to force using gnu11? I've tried adding -std=gnu11 to the compiler path, but that doesn't seem to solve the issue.
#include <stdint.h>
#include <time.h>
uint64_t timer_diff(struct timespec *start)
{
uint64_t diff;
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
diff = UINT64_C(1000000000) * (now.tv_sec - start->tv_sec) +
now.tv_nsec - start->tv_nsec;
return diff;
}
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "/usr/lib/gcc",
"intelliSenseMode": "gcc-x64",
"browse": {
"path": [
"${workspaceFolder}/**"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
workspace/didChangeConfiguration
IntelliSense Engine = Default.
The extension will use the Tag Parser for IntelliSense when #includes don't resolve.
Autocomplete is enabled.
Error squiggles are enabled.
File exclude: **/.git
File exclude: **/.svn
File exclude: **/.hg
File exclude: **/CVS
File exclude: **/.DS_Store
File exclude: **/.vscode
Search exclude: **/node_modules
Search exclude: **/bower_components
Search exclude: **/.vscode
textDocument/didOpen
cpptools/queryCompilerDefaults
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
terminating child process: 5243
cpptools/activeDocumentChange
cpptools/textEditorSelectionChange
cpptools/didChangeFolderSettings
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
Code browsing service initialized
Attempting to get defaults from compiler found on the machine: '/usr/bin/gcc'
Folder: /usr/lib/gcc/x86_64-linux-gnu/5/include/ will be indexed
Folder: /usr/local/include/ will be indexed
Folder: /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/ will be indexed
Folder: /usr/include/ will be indexed
Folder: /home/dan/Desktop/vscode-test/ will be indexed
textDocument/didOpen
Discovering files...
Processing folder (recursive): /usr/lib/gcc/x86_64-linux-gnu/5/include/
Processing folder (recursive): /usr/local/include/
Processing folder (recursive): /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/
Processing folder (recursive): /usr/include/
textDocument/documentSymbol
textDocument/codeAction
sending compilation args for /home/dan/Desktop/vscode-test/main.c
include: /usr/lib/gcc/x86_64-linux-gnu/5/include
include: /usr/local/include
include: /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
include: /usr/include/x86_64-linux-gnu
include: /usr/include
define: __STDC__=1
define: __STDC_VERSION__=201112L
define: __STDC_UTF_16__=1
define: __STDC_UTF_32__=1
define: __STDC_HOSTED__=1
define: __GNUC__=5
define: __GNUC_MINOR__=4
define: __GNUC_PATCHLEVEL__=0
define: __VERSION__="5.4.0 20160609"
define: __ATOMIC_RELAXED=0
define: __ATOMIC_SEQ_CST=5
define: __ATOMIC_ACQUIRE=2
define: __ATOMIC_RELEASE=3
define: __ATOMIC_ACQ_REL=4
define: __ATOMIC_CONSUME=1
define: __FINITE_MATH_ONLY__=0
define: _LP64=1
define: __LP64__=1
define: __SIZEOF_INT__=4
define: __SIZEOF_LONG__=8
define: __SIZEOF_LONG_LONG__=8
define: __SIZEOF_SHORT__=2
define: __SIZEOF_FLOAT__=4
define: __SIZEOF_DOUBLE__=8
define: __SIZEOF_LONG_DOUBLE__=16
define: __SIZEOF_SIZE_T__=8
define: __CHAR_BIT__=8
define: __BIGGEST_ALIGNMENT__=16
define: __ORDER_LITTLE_ENDIAN__=1234
define: __ORDER_BIG_ENDIAN__=4321
define: __ORDER_PDP_ENDIAN__=3412
define: __BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__
define: __FLOAT_WORD_ORDER__=__ORDER_LITTLE_ENDIAN__
define: __SIZEOF_POINTER__=8
define: __SIZE_TYPE__=long unsigned int
define: __PTRDIFF_TYPE__=long int
define: __WCHAR_TYPE__=int
define: __WINT_TYPE__=unsigned int
define: __INTMAX_TYPE__=long int
define: __UINTMAX_TYPE__=long unsigned int
define: __CHAR16_TYPE__=short unsigned int
define: __CHAR32_TYPE__=unsigned int
define: __SIG_ATOMIC_TYPE__=int
define: __INT8_TYPE__=signed char
define: __INT16_TYPE__=short int
define: __INT32_TYPE__=int
define: __INT64_TYPE__=long int
define: __UINT8_TYPE__=unsigned char
define: __UINT16_TYPE__=short unsigned int
define: __UINT32_TYPE__=unsigned int
define: __UINT64_TYPE__=long unsigned int
define: __INT_LEAST8_TYPE__=signed char
define: __INT_LEAST16_TYPE__=short int
define: __INT_LEAST32_TYPE__=int
define: __INT_LEAST64_TYPE__=long int
define: __UINT_LEAST8_TYPE__=unsigned char
define: __UINT_LEAST16_TYPE__=short unsigned int
define: __UINT_LEAST32_TYPE__=unsigned int
define: __UINT_LEAST64_TYPE__=long unsigned int
define: __INT_FAST8_TYPE__=signed char
define: __INT_FAST16_TYPE__=long int
define: __INT_FAST32_TYPE__=long int
define: __INT_FAST64_TYPE__=long int
define: __UINT_FAST8_TYPE__=unsigned char
define: __UINT_FAST16_TYPE__=long unsigned int
define: __UINT_FAST32_TYPE__=long unsigned int
define: __UINT_FAST64_TYPE__=long unsigned int
define: __INTPTR_TYPE__=long int
define: __UINTPTR_TYPE__=long unsigned int
define: __has_include(STR)=__has_include__(STR)
define: __has_include_next(STR)=__has_include_next__(STR)
define: __GXX_ABI_VERSION=1009
define: __SCHAR_MAX__=0x7f
define: __SHRT_MAX__=0x7fff
define: __INT_MAX__=0x7fffffff
define: __LONG_MAX__=0x7fffffffffffffffL
define: __LONG_LONG_MAX__=0x7fffffffffffffffLL
define: __WCHAR_MAX__=0x7fffffff
define: __WCHAR_MIN__=(-__WCHAR_MAX__ - 1)
define: __WINT_MAX__=0xffffffffU
define: __WINT_MIN__=0U
define: __PTRDIFF_MAX__=0x7fffffffffffffffL
define: __SIZE_MAX__=0xffffffffffffffffUL
define: __INTMAX_MAX__=0x7fffffffffffffffL
define: __INTMAX_C(c)=c ## L
define: __UINTMAX_MAX__=0xffffffffffffffffUL
define: __UINTMAX_C(c)=c ## UL
define: __SIG_ATOMIC_MAX__=0x7fffffff
define: __SIG_ATOMIC_MIN__=(-__SIG_ATOMIC_MAX__ - 1)
define: __INT8_MAX__=0x7f
define: __INT16_MAX__=0x7fff
define: __INT32_MAX__=0x7fffffff
define: __INT64_MAX__=0x7fffffffffffffffL
define: __UINT8_MAX__=0xff
define: __UINT16_MAX__=0xffff
define: __UINT32_MAX__=0xffffffffU
define: __UINT64_MAX__=0xffffffffffffffffUL
define: __INT_LEAST8_MAX__=0x7f
define: __INT8_C(c)=c
define: __INT_LEAST16_MAX__=0x7fff
define: __INT16_C(c)=c
define: __INT_LEAST32_MAX__=0x7fffffff
define: __INT32_C(c)=c
define: __INT_LEAST64_MAX__=0x7fffffffffffffffL
define: __INT64_C(c)=c ## L
define: __UINT_LEAST8_MAX__=0xff
define: __UINT8_C(c)=c
define: __UINT_LEAST16_MAX__=0xffff
define: __UINT16_C(c)=c
define: __UINT_LEAST32_MAX__=0xffffffffU
define: __UINT32_C(c)=c ## U
define: __UINT_LEAST64_MAX__=0xffffffffffffffffUL
define: __UINT64_C(c)=c ## UL
define: __INT_FAST8_MAX__=0x7f
define: __INT_FAST16_MAX__=0x7fffffffffffffffL
define: __INT_FAST32_MAX__=0x7fffffffffffffffL
define: __INT_FAST64_MAX__=0x7fffffffffffffffL
define: __UINT_FAST8_MAX__=0xff
define: __UINT_FAST16_MAX__=0xffffffffffffffffUL
define: __UINT_FAST32_MAX__=0xffffffffffffffffUL
define: __UINT_FAST64_MAX__=0xffffffffffffffffUL
define: __INTPTR_MAX__=0x7fffffffffffffffL
define: __UINTPTR_MAX__=0xffffffffffffffffUL
define: __GCC_IEC_559=2
define: __GCC_IEC_559_COMPLEX=2
define: __FLT_EVAL_METHOD__=0
define: __DEC_EVAL_METHOD__=2
define: __FLT_RADIX__=2
define: __FLT_MANT_DIG__=24
define: __FLT_DIG__=6
define: __FLT_MIN_EXP__=(-125)
define: __FLT_MIN_10_EXP__=(-37)
define: __FLT_MAX_EXP__=128
define: __FLT_MAX_10_EXP__=38
define: __FLT_DECIMAL_DIG__=9
define: __FLT_MAX__=3.40282346638528859812e+38F
define: __FLT_MIN__=1.17549435082228750797e-38F
define: __FLT_EPSILON__=1.19209289550781250000e-7F
define: __FLT_DENORM_MIN__=1.40129846432481707092e-45F
define: __FLT_HAS_DENORM__=1
define: __FLT_HAS_INFINITY__=1
define: __FLT_HAS_QUIET_NAN__=1
define: __DBL_MANT_DIG__=53
define: __DBL_DIG__=15
define: __DBL_MIN_EXP__=(-1021)
define: __DBL_MIN_10_EXP__=(-307)
define: __DBL_MAX_EXP__=1024
define: __DBL_MAX_10_EXP__=308
define: __DBL_DECIMAL_DIG__=17
define: __DBL_MAX__=((double)1.79769313486231570815e+308L)
define: __DBL_MIN__=((double)2.22507385850720138309e-308L)
define: __DBL_EPSILON__=((double)2.22044604925031308085e-16L)
define: __DBL_DENORM_MIN__=((double)4.94065645841246544177e-324L)
define: __DBL_HAS_DENORM__=1
define: __DBL_HAS_INFINITY__=1
define: __DBL_HAS_QUIET_NAN__=1
define: __LDBL_MANT_DIG__=64
define: __LDBL_DIG__=18
define: __LDBL_MIN_EXP__=(-16381)
define: __LDBL_MIN_10_EXP__=(-4931)
define: __LDBL_MAX_EXP__=16384
define: __LDBL_MAX_10_EXP__=4932
define: __DECIMAL_DIG__=21
define: __LDBL_MAX__=1.18973149535723176502e+4932L
define: __LDBL_MIN__=3.36210314311209350626e-4932L
define: __LDBL_EPSILON__=1.08420217248550443401e-19L
define: __LDBL_DENORM_MIN__=3.64519953188247460253e-4951L
define: __LDBL_HAS_DENORM__=1
define: __LDBL_HAS_INFINITY__=1
define: __LDBL_HAS_QUIET_NAN__=1
define: __DEC32_MANT_DIG__=7
define: __DEC32_MIN_EXP__=(-94)
define: __DEC32_MAX_EXP__=97
define: __DEC32_MIN__=1E-95DF
define: __DEC32_MAX__=9.999999E96DF
define: __DEC32_EPSILON__=1E-6DF
define: __DEC32_SUBNORMAL_MIN__=0.000001E-95DF
define: __DEC64_MANT_DIG__=16
define: __DEC64_MIN_EXP__=(-382)
define: __DEC64_MAX_EXP__=385
define: __DEC64_MIN__=1E-383DD
define: __DEC64_MAX__=9.999999999999999E384DD
define: __DEC64_EPSILON__=1E-15DD
define: __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD
define: __DEC128_MANT_DIG__=34
define: __DEC128_MIN_EXP__=(-6142)
define: __DEC128_MAX_EXP__=6145
define: __DEC128_MIN__=1E-6143DL
define: __DEC128_MAX__=9.999999999999999999999999999999999E6144DL
define: __DEC128_EPSILON__=1E-33DL
define: __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL
define: __REGISTER_PREFIX__=
define: __USER_LABEL_PREFIX__=
define: __GNUC_STDC_INLINE__=1
define: __NO_INLINE__=1
define: __STRICT_ANSI__=1
define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1
define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1
define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1
define: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1
define: __GCC_ATOMIC_BOOL_LOCK_FREE=2
define: __GCC_ATOMIC_CHAR_LOCK_FREE=2
define: __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2
define: __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2
define: __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2
define: __GCC_ATOMIC_SHORT_LOCK_FREE=2
define: __GCC_ATOMIC_INT_LOCK_FREE=2
define: __GCC_ATOMIC_LONG_LOCK_FREE=2
define: __GCC_ATOMIC_LLONG_LOCK_FREE=2
define: __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1
define: __GCC_ATOMIC_POINTER_LOCK_FREE=2
define: __GCC_HAVE_DWARF2_CFI_ASM=1
define: __PRAGMA_REDEFINE_EXTNAME=1
define: __SSP_STRONG__=3
define: __SIZEOF_INT128__=16
define: __SIZEOF_WCHAR_T__=4
define: __SIZEOF_WINT_T__=4
define: __SIZEOF_PTRDIFF_T__=8
define: __amd64=1
define: __amd64__=1
define: __x86_64=1
define: __x86_64__=1
define: __SIZEOF_FLOAT80__=16
define: __SIZEOF_FLOAT128__=16
define: __ATOMIC_HLE_ACQUIRE=65536
define: __ATOMIC_HLE_RELEASE=131072
define: __k8=1
define: __k8__=1
define: __code_model_small__=1
define: __MMX__=1
define: __SSE__=1
define: __SSE2__=1
define: __FXSR__=1
define: __SSE_MATH__=1
define: __SSE2_MATH__=1
define: __gnu_linux__=1
define: __linux=1
define: __linux__=1
define: __unix=1
define: __unix__=1
define: __ELF__=1
define: __DECIMAL_BID_FORMAT__=1
define: _STDC_PREDEF_H=1
define: __STDC_IEC_559__=1
define: __STDC_IEC_559_COMPLEX__=1
define: __STDC_ISO_10646__=201505L
define: __STDC_NO_THREADS__=1
other: --gcc
other: --gnu_version=50400
stdver: --c11
intelliSenseMode: gcc
Checking for syntax errors: file:///home/dan/Desktop/vscode-test/main.c
queue_update_intellisense for files in tu of: /home/dan/Desktop/vscode-test/main.c
Processing folder (recursive): /home/dan/Desktop/vscode-test/
Discovering files: 3870 file(s) processed
0 file(s) removed from database
Done discovering files.
Populate include completion cache.
Parsing remaining files...
Parsing: 0 files(s) processed
Done parsing remaining files.
terminating child process: 5258
errorSquiggles count: 1
textDocument/codeAction
textDocument/hover
textDocument/hover
cpptools/textEditorSelectionChange
textDocument/codeAction
cpptools/activeDocumentChange
cpptools/textEditorSelectionChange
cpptools/textEditorSelectionChange
textDocument/codeAction
I repro the issue. It looks like _GNU_SOURCE needs to be defined for c files, not C++. Using gnu11 is supposed to work in terms of the defines that are used, but we could have a bug. You can workaround this bug via adding "_GNU_SOURCE" to the defines section of c_cpp_properties.json (or C_Cpp.default.defines in settings.json).
But from what I read at https://exceptionshub.com/_gnu_source-and-__use_gnu.html it sounds like maybe users are expected to define _GNU_SOURCE themselves in their build process or code (I haven't verified that though).
I have this same problem.
The underlying cause seem to be that when cpptools is querying the compiler defines, it passes something like -std=c11 (depending on what you configured in c_cpp_properties.json) to the compiler when it does the gcc -Wp,-v -E -xc -dD /dev/null trick.
The presence of -std=c11 on the command line puts gcc in "strict C mode", and means _GNU_SOURCE (and other important macros that are contingent on that, like _DEFAULT_SOURCE) don't get set. So Intellisense will see an inconsistent view of the world.
Perhaps you be able to set the cStandard in the json to gnu11, so -std=gnu11 can be passed? Or a mode where no standard is passed or something like that.
@travisdowns Ah, thanks for the info. Maybe we can add the gnu std versions when we add C++20 versions.
@sean-mcmanus - thanks!
In the meantime it would be nice to have a bit more visibility into exactly how the cpptools extension is determining the args, e.g., in the debug log it the command line used to invoke gcc doesn't appear, but it would be very useful it it did (since various things are unclear, e.g., if you add to compilerPath an argument, how it gets positioned relative to the arguments that cpptools adds).
@travisdowns The user compilerPath args get added to the front of the args that we add, so any "-std" set by the user is overwritten by the one we set.
It would be really nice if the generated -std argument was prepended instead of appended to the user-provided arguments. I have a codebase that requires __GNUC__ to be set and __STRICT_ANSI__ to be unset in order for the correct typedefs to exist. Because this extension forces gcc to report its definitions for an ANSI standard, I am unable to get that combination of definitions (and there also doesn't seem to be any way for me to manually undef __STRICT_ANSI__).
The only workaround I've found is to pass bogus arguments to the compiler so that it errors out and doesn't report any definitions at all. Then, I can set the ones I need manually.
When the gnu options are supported will they auto configure from the compile_commands.json?
ie my project emits a compile_commands.json that includes -std=gnu11, will all the red squiggles go away once this is fixed? We expect the project to compile in glibc's -D_DEFAULT_SOURCE mode as is the default for all the -std=gnu* options. Not in STRICT_ANSI mode as vs code defaults to.
It is a significant, practicle differnce that was very hard to uncover as being caused by -std.
@jgunthorpe If your project uses one "std" then I believe it would work to just set that in the c_cpp_properties.json; however, if you require the "std" to be picked up in the compile_commands.json command arguments, then we would also need to fix https://github.com/microsoft/vscode-cpptools/issues/1755 (the workaround for that for non-std flags is to pass the arguments in the compilerPath or compilerArgs properties).
The gnu standards are supported now with https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0-insiders2 . Let us know if you hit any issues with that.
The gnu standards are supported now with https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0-insiders2 . Let us know if you hit any issues with that.
Thanks!
Can you give a one-liner one how to use it?
Is it like "cppStandard" : "gnu++17"? The release notes link back here so it would be good to have a brief note about how it's fixed.
The GNU standards were added as additional options to properties cStandard and cppStandard. The example you provide is correct usage:
"cppStandard" : "gnu++17"
...or "-std=gnu++17" if it's part of compilerArgs, args in compile_commands.json, etc.
This issue is fixed in 0.28.0.
0.28.0 release: https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0
Most helpful comment
The gnu standards are supported now with https://github.com/microsoft/vscode-cpptools/releases/tag/0.28.0-insiders2 . Let us know if you hit any issues with that.