【问题标题】:Can a C++ static template function be in a struct with C linkage?C++ 静态模板函数可以在具有 C 链接的结构中吗?
【发布时间】:2015-05-05 22:31:26
【问题描述】:

我的头文件中有以下声明:

extern "C" {
    struct lfModifier {
        template<typename T>
        static void ModifyColor_Vignetting_PA (
           void *data, float x, float y, T *rgb, int comp_role, int count);
    }
}

GCC 可能正确地抱怨“错误:带有 C 链接的模板”。但模板毕竟是静态的。我可以很容易地将它从课堂上移到 cpp 文件中。我不喜欢这样做,因为将它放在结构中会增加代码的可读性。

有没有办法在这种情况下使用静态模板?

【问题讨论】:

  • 即使这样也没有实际用处
  • 你想通过具有 C 链接的 member 函数来完成什么?没有其他类的extern C 成员函数可以共享相同的名称?
  • @Mondkin:它是关于 C++ 库的。我认为(我维护其他人的代码)目标是为 C 和 C++ 程序使用相同的库头文件。 C 程序可以看到struct 和属性,而 C++ 程序可以看到除了 C 链接之外的所有内容。好吧,然后,模板成员失败了。
  • 你不能在头文件中包含这个,因为 C 不知道模板是什么。如果你使用 #define 将它隐藏在 C 中,你就打破了单一定义规则。
  • @BenVoigt:它对 C 隐藏,#ifdef __cplusplus

标签: c++ class templates static linkage


【解决方案1】:

如果你需要结构中的其他成员有C链接,模板函数可以有C++链接。

extern "C" {
    struct lfModifier {
        int val;
        void foo();

        extern "C++" template<typename T>
        static void ModifyColor_Vignetting_PA (
           void *data, float x, float y, T *rgb, int comp_role, int count);
    }
}

结构成员的extern C++ 将覆盖结构的extern C 属性。

【讨论】:

    【解决方案2】:
    // Inside header
    extern "C" { struct X; };
    struct X {
        template <typename T> static void f() {}
    };
    
    // Inside cpp
    int main() {
        X::f<int>();
    }
    

    【讨论】:

    • 此代码块可能会回答问题,请尝试添加相关说明。
    【解决方案3】:

    我认为这是不可能的。

    检查这个其他问题及其答案: In C++ source, what is the effect of extern "C"?

    最重要的部分:

    • 类成员忽略外部“C”
    • 至多一个具有特定名称的函数可以具有“C”链接(无论命名空间如何)
    • 'extern "C"' 中的'static' 有效;如此声明的实体具有内部链接,因此没有语言链接

    最重要的是中间的那个:当你实例化你的模板时,你会有两个同名但参数不同的函数,这是 C 不直接支持的。所以 C++ 编译器需要修改名称用于模板化函数。

    另外,当你在结构之外声明你的函数并且你说它是static 你给它内部链接,所以extern C 将被忽略(这就是它在这种情况下编译的原因)。您是否使用objdump 查看编译后的名称以确保它没有被破坏?

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多