想要使用__ DATE __和__ TIME __作为整数,以便在编译时为我的代码提供自动化版本.
#define STRINGIZER(arg) #arg
#define STR_VALUE(arg) STRINGIZER(arg)
#define DATE_as_int_str useD(__DATE__) // What can be done ?
#define TIME_as_int_str useT(__TIME__) // What can be done ?
#define VERSION 1.4
#define COMPLETE_VERSION STR_VALUE(VERSION) "." DATE_as_int_str "." TIME_as_int_str
Run Code Online (Sandbox Code Playgroud)
并获得COMPLETE_VERSION一个字符串const unsigned char [].
const unsigned char completeVersion[] = ?? COMPLETE_VERSION;
Run Code Online (Sandbox Code Playgroud)
应输出1.4.1432.2234的东西.
其中一个可能的解决方案可能是但不起作用:convert - date -to-unsigned-int
在编译时的上下文中,convertint-date-and-time-string-to-just-integers-in-c 可以参考expand-and-stringification-how-to-get-the-marco-name-not-its-value
为了将"todo"项添加到我的代码中,我想在编译器输出中添加一条消息.
我希望它看起来像这样:
c:/temp/main.cpp(104): TODO - add code to implement this
Run Code Online (Sandbox Code Playgroud)
为了利用Visual Studio构建输出功能,通过双击导航到相应的行.
但__LINE__宏似乎扩展到了一个int不允许写作的
#pragma message( __FILE__ "("__LINE__"): ..." )
Run Code Online (Sandbox Code Playgroud)
会有另一种方式吗?
如果我使用gcc或icc,如何在编译时检测?
(我很困惑地发现icc定义__GNUC__- 甚至__GNUC_MINOR__和__GNUC_PATCHLEVEL__!为什么?)
我在libmagic代码中找到了这些行,(sourceforge.net/projects/libmagic/files/latest/download).他们的意思是什么?什么是python等价物?
#ifdef __GNUC__
__attribute__((unused))
#endif
Run Code Online (Sandbox Code Playgroud)
什么__GNUC__意思?
所以它似乎检查是否安装了GCC编译器,是什么意思__CC_ARM,__ ICCARM __,__ GNUC __,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
什么是__attribute__((unused))?
这里有一段代码片段,但没有解释:我如何最好地消除有关未使用变量的警告?
是什么样的区别__GNUC__,并_MSC_VER
有一定的解释上_MSC_VER,但它是什么一回事呢?如何检测我是否使用Visual Studio 2008编译代码?
最后一个问题:我怎样才能#ifdef检查操作系统是否正在使用GNU和MS可视化工作室编译我的python代码?
GCC 9最近__LINE__在某些情况下更改了指令的行为。下面的程序说明了此更改:
#include <stdio.h>
#define expand() __LINE__
int main() {
printf("%d\n",expand(
));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于宏expand()(扩展为__LINE__)跨越多行,因此GCC最多8.3(而Clang最多8.0)考虑了扩展的最后一行的编号print 5。但是,GCC 9会考虑第一行并打印4。
(Godbolt链接:https://godbolt.org/z/3Nk2al )
C11标准关于的确切行为不是很精确__LINE__,除了:
6.10.8预定义的宏名称
在以下子节中列出的预定义宏的值(
__FILE__和除外__LINE__)在整个转换单元中保持不变。(...)
6.8.10.1强制宏
以下宏名称应由实现定义:
(...)
__LINE__当前源行的假定行号(在当前源文件中)(整数常量)。
我认为这意味着确切的值是实现定义的,因此不能期望其值在不同的编译器版本或不同的编译器中保持不变。还是在标准的其他地方对这种效果有一些争论?
例如,可以说只要源本身没有变化,当前源行的假定行号就应该稳定吗?
我经常发现自己写的东西
int computedValue = ...;
return MAX(0, MIN(5, computedValue));
Run Code Online (Sandbox Code Playgroud)
我希望能够将其写为单个单行宏.它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型.
任何人都可以告诉我如何把它变成一个宏吗?
什么是传统c风格#error关键字的迅速替代?
当预定义失败时,我需要它来引发编译时错误:
#if CONFIG1
...
#elseif CONFIG2
...
#else
#error "CONFIG not defined"
#endif
Run Code Online (Sandbox Code Playgroud) 有没有办法为我本地安装的Code :: Blocks设置一些预定义的宏.
要详细说明,基本上我想在pc上编译某些块,而不是我发送代码的任何地方.实现此目的的一种方法如下:
#define MYPC
#ifdef MYPC
//do something
#else
// do something else
#endif
Run Code Online (Sandbox Code Playgroud)
我想要实现同样的目标,但我不想包含#define MYPC这一行,并且想在IDE中添加它.我知道如何在Visual Studio中执行此操作,我认为它也存在于Code :: Blocks中.谢谢.
我有一个c ++项目,必须打印修订字符串.修订字符串是公司明智的,协议包括构建时间为yyyy/mm/dd.
我用它从构建系统中将其指定为宏,但这不再是一个选项,因为会混淆预编译的头文件(在日期更改时的增量构建中).
我想从编译器获得的生成日期,但要实现这个__DATE__,并__TIMESTAMP__给予一个月嗯.
有什么想法,我怎么能把月份作为数字?
根据下面的答案我完成的版本是:
#define __MONTH__ (\
__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? "01" : "06") \
: __DATE__ [2] == 'b' ? "02" \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? "03" : "04") \
: __DATE__ [2] == 'y' ? "05" \
: __DATE__ [2] == 'l' ? "07" \
: __DATE__ [2] == 'g' ? "08" \
: __DATE__ [2] == 'p' ? …Run Code Online (Sandbox Code Playgroud) 我目前正在处理为Turbo C++设计的遗留代码。为了解决 Turbo C++ 缺乏bool数据类型的问题,该程序包含以下代码行。
// Necessary when compiling with Turbo C++
enum bool {false, true};
Run Code Online (Sandbox Code Playgroud)
大多数 C++ 编译器无法运行带有error: expected identifier before 'bool'. 虽然我很想切换到更新的编译器,但不幸的是,我需要维护此解决方法以实现向后兼容性。
我如何指示该特定代码行只能在 Turbo C++ 中编译?
predefined-macro ×10
c ×5
c++ ×5
gcc ×2
macros ×2
codeblocks ×1
g++ ×1
icc ×1
line-numbers ×1
objective-c ×1
pragma ×1
swift ×1
turbo-c++ ×1