C预处理器:字符串化不起作用

时间:2016-04-21 09:08:13

标签: c c-preprocessor

我想声明一个静态const数组,其中包含带有版本信息的字符串。

我已经有两个带版本号的宏,我想根据它生成一个初始的const字符串。

我正在尝试使用here描述的方法,但它不能像使用可用的编译器工具那样工作。

我的代码是下一个:

$.signin = function() {
    var inputVals = $("#form_signin").serialize();
    $.ajax({
        url : "api/v1/userlogin",
        data : inputVals,
        dataType : "json",
        type : "post",
        success : function(response) {
            if (response.error) {
                $(".popup").trigger("click");
                $(".modal-title").html(response.message_title);
                $(".modal-body").html(response.message);
            } else {
                window.location.href = "index.php";
            }
            console.log(response);
        }
    });
    return false;
}

当我打印数组时,其值为" API_VERSION_MAJOR.API_VERSION_MINOR" 而不是" 4.47"

我使用定制的GCC 4.4.1 ARM交叉编译器。

当我在使用Cygwin GCC 4.5.3的PC上执行相同操作时,它可以正常工作。

提前感谢您的帮助。

更新

原来, API_VERSION_MAJOR API_VERSION_MINOR 宏在源文件中是不可见的。我错过了包括。很简单。很容易显而易见。

请注意,在这种情况下没有任何警告输出。

1 个答案:

答案 0 :(得分:7)

然后你定制的GCC 4.4.1 ARM交叉编译器就是错误的。

如果你自己编译它,有时它会有助于禁用一些过于激进的优化选项,这些选项可能没有解决所有问题。

在框外思考,您可以调整源代码以避免问题:

#define API_VERSION_MAJOR "4"
#define API_VERSION_MINOR "47"
static const char OSAPIVersion[] = API_VERSION_MAJOR "." API_VERSION_MINOR;

或者可能在运行时构造字符串:

#define API_VERSION_MAJOR 4
#define API_VERSION_MINOR 47
static char OSAPIVersion[8];
int main(void) {
  snprintf (OSAPIVersion, sizeof OSAPIVersion, "%d.%d", API_VERSION_MAJOR, API_VERSION_MINOR);
}